Мне нужно постоянно прослушивать входящие SMS-сообщения на Android, поэтому я сделал широковещательный приемник. Этот приемник должен работать постоянно.
В моем приложении есть только приветственный мир. И работать нормально до остановки трансляции.
После неопределенного времени (вероятно, 24 часа) моя трансляция перестает прослушиваться без каких-либо сообщений о сбоях, и мой пользовательский интерфейс продолжает работать.
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
public ComponentName startService(Intent service) {
return super.startService(service);
}
private static final int MY_PERMISSIONS_REQUEST_RECEIVE_SMS = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(ContextCompat.checkSelfPermission(this,Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.RECEIVE_SMS)){
}
else {
// Pop will go up because i need it
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_RECEIVE_SMS);
}
}
if(ContextCompat.checkSelfPermission(this,Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.INTERNET)){
}
else {
// Pop will go up because i need it
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET}, MY_PERMISSIONS_REQUEST_RECEIVE_SMS);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode)
{
case MY_PERMISSIONS_REQUEST_RECEIVE_SMS:
{
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this,"Thanks for permission", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this,"wtf man.", Toast.LENGTH_LONG).show();
}
}
}
}
MyReceiver.java
public class MyReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "SmsBroadcastReceiver";
private static final String urlAdress = "url address";
String msg = "";
String phoneNo = "";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"********Intent received " + intent.getAction());
if(intent.getAction() == SMS_RECEIVED){
Bundle dataBundle = intent.getExtras();
if(dataBundle != null){
Object[] mypdu = (Object[])dataBundle.get("pdus");
final SmsMessage[] message = new SmsMessage[mypdu.length];
for (int i =0; i < mypdu.length; i++){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
String format = dataBundle.getString("format");
message[i] = SmsMessage.createFromPdu((byte[])mypdu[i], format);
}
else
{
message[i] = SmsMessage.createFromPdu((byte[])mypdu[i]);
}
msg += message[i].getMessageBody();
phoneNo = message[i].getOriginatingAddress();
}
Toast.makeText(context,"message" + msg + "\nNumber:" + phoneNo, Toast.LENGTH_LONG ).show();
sendPost();
}
}
}
public void sendPost() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlAdress);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
conn.setRequestProperty("Accept","application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
JSONObject jsonParam = new JSONObject();
jsonParam.put("message", msg);
jsonParam.put("phoneNumber", phoneNo);
Log.i("JSON", jsonParam.toString());
DataOutputStream os = new DataOutputStream(conn.getOutputStream());
//os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
os.writeBytes(jsonParam.toString());
os.flush();
os.close();
Log.i("STATUS", String.valueOf(conn.getResponseCode()));
Log.i("MSG" , conn.getResponseMessage());
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
AndroidFanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SmsReveiver">
<service
android:exported="false" />
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter android:priority="100">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Есть ли какой-нибудь другой способ без оказания услуги? Я не знаю, по какой причине вещательный приемник останавливается. В моем процессе отладки все выглядит нормально. Пожалуйста, помогите, как я могу решить эту проблему.
Я пытался
- Поддерживает телефон в активном состоянии все время во время зарядки.
Вопрос по теме: приемник вещания автоматически останавливается через некоторое время