When i test the following Java SMS Api code in Intellij IDE i get SMS response but when i use it in an android app am working on. The app crashes and i get logcat error I have included below. I have been working on the error for a number of days but no success. I have included the following codes.
- Smsgateway Class
- Main Class
- Logcat error am getting at run time
Please assist.
SmsGateway Class
package com.example.smsApi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.io.UnsupportedEncodingException;
public class SmsGateway {
private String mBaseUrl;
private int mPartnerId;
private String mApiKey;
private String mShortCode;
private HttpURLConnection connection;
public SmsGateway(String baseUrl, int partnerId, String apiKey, String shortCode) {
this.mBaseUrl = baseUrl;
this.mPartnerId = partnerId;
this.mApiKey = apiKey;
this.mShortCode = shortCode;
}
private String getFinalURL(String mobile, String message) {
String encodedMessage = null;
try {
encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String encodedMobiles = null;
try {
encodedMobiles = URLEncoder.encode(mobile, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return mBaseUrl + "?apikey=" + mApiKey + "&partnerID=" + mPartnerId + "&shortcode=" +
mShortCode + "&mobile=" + encodedMobiles + "&message=" + encodedMessage;
}
public String sendSingleSms(String message, String mobile) throws IOException {
String finalUrl = getFinalURL(mobile, message);
return makeHttpGetRequest(finalUrl);
}
public String sendBulkSms(String message, String[] mobiles) throws IOException {
String numbers = Arrays.toString(mobiles)
.replace("[", "")
.replace("]", "")
.replace(" ", "");
String finalUrl = getFinalURL(numbers, message);
return makeHttpGetRequest(finalUrl);
}
private String makeHttpGetRequest(String urlString) throws IOException {
URL url = makeURL(urlString);
if (connection == null) {
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(15000);
}
StringBuilder content;
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
content = new StringBuilder();
while ((line = in.readLine()) != null) {
content.append(line);
content.append(System.lineSeparator());
}
return content.toString();
}
private URL makeURL(String urlString) throws MalformedURLException {
return new URL(urlString);
}
}
Main Class
String baseUrl = "";
int partnerId = xxx;
String apiKey = "xxx";
String shortCode = "xxx";
SmsGateway gateway = new SmsGateway(baseUrl, partnerId, apiKey, shortCode);
String[] strings = {"xxx"};
try {
String res = gateway.sendBulkSms("Hello Bulk from Java API ", strings);
System.out.println(res);
} catch (IOException e) {
e.printStackTrace();
}
Logcat
2021-03-26 13:12:23.103 15301-15301/? E/libc: Access denied finding property "persist.vendor.sys.activitylog"
2021-03-26 13:12:25.683 15301-15301/com.example.smsApi E/libc: Access denied finding property "persist.vendor.log.tel_dbg"
2021-03-26 13:12:25.721 15301-15301/com.example.smsApi E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.slickkwear, PID: 15301
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.smsApi/com.example.smsApi.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3091)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1843)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6758)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
at java.net.InetAddress.getAllByName(InetAddress.java:1154)
at com.android.okhttp.Dns$1.lookup(Dns.java:39)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:299)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:237)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:472)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:418)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26)
at com.example.slickkwear.SmsGateway.makeHttpGetRequest(SmsGateway.java:83)
at com.example.slickkwear.SmsGateway.sendBulkSms(SmsGateway.java:66)
at com.example.slickkwear.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2933)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3091)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1843)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6758)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912)