2015-10-31 15 views
0

Я новичок в Android, и я написал следующий код, код может показать тост в телефоне с API 10, но я не могу показать тост и запустить onReceive в телефоне с API 19.Тост не показан для простого приемника SMS-сообщений

Я искал в Интернете и узнал, что должен добавить флаг с намерением: flag_include_stopped_packages. Я думаю, это ответ на мою проблему.

Но как его добавить для системной трансляции? Оцените, сможет ли кто-нибудь показать подходящий код. Я не могу найти подходящий код из Интернета, показывая это. Спасибо!

SMS.java

public class SMS extends AppCompatActivity { 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

IncomingSms.java

public class IncomingSms extends BroadcastReceiver { 
    final SmsManager sms = SmsManager.getDefault(); 

public void onReceive(Context context,Intent intent) { 
    final Bundle bundle = intent.getExtras(); 
    try { 
     if (bundle != null) { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) { 
       SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String message = currentMessage.getDisplayMessageBody(); 
       String senderNum = currentMessage.getDisplayOriginatingAddress(); 
       Log.i("SmsReceiver", senderNum + message); 
       Toast.makeText(context, 
         "send from " + senderNum + message, Toast.LENGTH_LONG).show(); 

      } 
     } 
    } catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" + e); 
    } 
} 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.security.security" > 

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 
<uses-permission android:name="android.permission.READ_SMS"/> 
<uses-permission android:name="android.permission.SEND_SMS"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".SMS" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.INFO"/> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".IncomingSms"> 
     <intent-filter android:priority="999"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
      </intent-filter> 
    </receiver> 

</application> 

ответ

0

Сначала создайте свой собственный класс приемника, расширив его от стандартного класса Android BroadcastReceiver. Затем @Override метод onReceive() в вашем классе. Этот метод onReceive() будет вызываться, когда к телефону придет новое SMS. Ниже представлен мой класс приемника для получения входящего SMS-уведомления.

//Here is your broadcast receiver class 
public class YourBroadcastReceiver extends BroadcastReceiver{ 
    private static final String TAG = "MyBroadCastReceiver"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.i(TAG,"OnReceive ++>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); 
      Bundle bndl = intent.getExtras(); 
      SmsMessage[] msg = null; 
      String str = "";   
      if (null != bndl) 
      { 
       //---retrieve the SMS message received--- 
       Object[] pdus = (Object[]) bndl.get("pdus"); 
       msg = new SmsMessage[pdus.length];   
       for (int i=0; i<msg.length; i++){ 
        msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);    
        str += "SMS From " + msg[i].getOriginatingAddress();     
        str += " :\r\n"; 
        str += msg[i].getMessageBody().toString(); 
        str += "\n"; 
       } 
       //---display incoming SMS as a Android Toast--- 
       Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
      } 
     } 
} 

Существует два способа зарегистрировать трансляцию в Android.

  1. Зарегистрировать трансляцию в файле манифеста проекта. Если вы будете использовать этот метод, вы не сможете управлять жизненным циклом широковещательного приемника. Это означает, что ваше приложение получит уведомление, пока вы не удалите приложение.

  2. Зарегистрируйте широковещательный приемник с использованием метода Context.registerReceiver() Android. Используя этот метод, мы можем контролировать его жизненный цикл, регистрируя и не регистрируя широковещательный приемник в соответствии с вашим требованием. Для регистрации BroadcastReceiver с помощью контекста Андроида visit this Answer

Так давайте зарегистрировать свой собственный класс приемника с входящим SMS умыслом фильтром в файле манифеста. Для примера входящего SMS мой файл манифеста выглядит ниже.

<uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="19" /> 

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 

<receiver 
     android:name ="FULL_PACKAGE_NAME.YourBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

Всё. После того, как вы установите приложение, в это время трансляция будет автоматически зарегистрирована в ОС Android, и вы получите уведомление в виде Android Toast с подробностями.

Получить дополнительную информацию visit here