2017-09-13 52 views
2

我有一個應用程序,基本上有兩個接收器,一個接收SMS消息和一個接收MMS消息。當應用程序運行時,它可以很好地工作,收到消息並且接收器都可以工作。不運行時,應用程序接收器不會被調用。除非應用程序正在運行,否則應用程序不會響應收到的短信。

這裏是在SMSReceiver的基本代碼:

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    Log.i(TAG, "Intent received: " + intent.getAction()); 
    Toast.makeText(context,"Message Received SMS",Toast.LENGTH_LONG).show(); 
} 

清單權限都在那裏和正確的。運行三星S7 Edge Android 7.0(Android 24)。即使不運行或在後臺,它也應該收到文本。

清單:

<uses-permission android:name="android.permission.RECEIVE_MMS"/> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <receiver android:name="com.webnation.text2email.receivers.SMSBroadcastReceiver"> 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.webnation.text2email.receivers.MMSBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> 

      <data android:mimeType="application/vnd.wap.mms-message" /> 
     </intent-filter> 
    </receiver> 
+0

你可能在清單中缺少'''exported'''屬性 – ahasbini

回答

0

您應該使用Service並通過intent到它,而不是與onReceive()處理它。 onReceive()中的context參數也不能用於執行UI操作,但它可用於啓動ActivityService

這裏的實施將如何爲onReceive()一個例子:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) { 
     Logger.LogI(TAG, "onReceive: received sms"); 
     Intent serviceIntent = new Intent(intent); 
     serviceIntent.setClassName(context, SmsParserService.class.getCanonicalName()); 
     context.startService(serviceIntent); 
    } 
} 

下面是用於爲SmsParserService實施一個例子:

/** 
* Service for parsing the SMS and retrieving the message 
*/ 
public class SmsParserService extends IntentService { 

    private static final String TAG = SmsParserService.class.getSimpleName(); 

    public SmsParserService() { 
     this("SmsParserService"); 
    } 

    /** 
    * Creates an IntentService. Invoked by your subclass's constructor. 
    * 
    * @param name Used to name the worker thread, important only for debugging. 
    */ 
    public SmsParserService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 

     if (extras != null) { 
      Object[] objects = (Object[]) extras.get("pdus"); 

      if (objects != null) { 
       for (Object object : objects) { 
        SmsMessage smsMessage; 
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
         smsMessage = SmsMessage.createFromPdu((byte[]) object, extras.getString("format")); 
        } else { 
         smsMessage = SmsMessage.createFromPdu((byte[]) object); 
        } 

        String message = smsMessage.getMessageBody(); 
       } 
      } 
     } 
    } 
} 

而在AndroidManifest.xml

<receiver 
    android:name=".services.SmsReceiver" 
    android:enabled="true" 
    android:exported="true" 
    android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
    </intent-filter> 
</receiver> 

<service 
    android:name=".services.SmsParserService" 
    android:enabled="true" 
    android:exported="false"> 
</service> 

還記得第在Service是後臺進程,這意味着某些UI元素(如DialogToast)可能無法正常工作。相反,你應該使用Activity這種情況。

+0

它甚至都不會調用onReceive(),所以你的建議甚至不會被調用。吐司永遠不會顯示。此外,與奧利奧,在未來的服務中運行的東西可能不是要走的路。 https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c –

+0

我已經用'''''AndroidManifest.xml'''條目更新了答案。由於您正在使用的條目,您可能沒有收到。如果由於不得不支持Android Oreo而導致Service不適合你,我相信你應該使用'''Activity''',但是我還沒有嘗試開始一個'''Service'''從Oreo的'Receiver''內,並且該文章沒有說明有關該文件的任何信息 – ahasbini

+0

您是否能夠找出這個問題? – ahasbini

相關問題