2016-07-04 156 views
0

我正在編寫一個Android應用程序(API級別15對不起,我無法克服這個兼容的原因),應該收到短信並顯示吐司/彈出。 這個應用程序將有設置和/或日誌記錄的標準活動,但傳入的短信應在收到也在後臺。短信接收通知

Googling around我發現了幾個代碼應該工作,因爲我需要,但不幸的是它沒有。

這些都是我在清單文件中添加的條目:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    [...] 

    <receiver android:name="com.bananainc.smsmirror.SMSListener"> 
     <intent-filter android:priority="100"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
</application> 

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

,這是我的SMSListener類:

public class SMSListener extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) 
    { 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 

     if (bundle != null) 
      try { 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       msgs = new SmsMessage[pdus.length]; 

       for (int i = 0; i < msgs.length; i++) { 
        msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
        String from = msgs[i].getOriginatingAddress(); 
        String body = msgs[i].getMessageBody(); 

        Toast.makeText(context, "SMS" + from + " : " + body , Toast.LENGTH_SHORT).show(); 

        Log.d("EVENT", "SMS" + from + " : " + body); 
       } 
      } catch (Exception e) { 
       Log.d("Exception caught", e.getMessage()); 
      } 
    } 
} 
} 

當然,我也得到了代碼管理MainActiity但是,到現在爲止,這不涉及傳入的SMS管理。

我哪裏失敗了?

請注意SMSListener代碼似乎不運行。如果我試圖調試它的線程保持'暫停',因爲它從來沒有被觸發。事實上,在logcat中沒有傾倒日誌行。

我注意到,在logcat中我得到了這樣的警告:

07-05 17:05:35.293 8277-8277/com.bananainc.smsmirror W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView) 

也許是很重要的。

順便說一句我在Windows 10 Home 64位下運行Android Studio 2.1.2

+0

主要活動中的註冊廣播接收機 – Shanto

+0

@Shanto thnx ...您的意思只是將' ...'條目移動到MainActivity中,或者通過代碼定義處理程序作爲MainActivity類的內部成員? – weirdgyn

回答

0

也加入這個權限您的清單:

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

如果您正在使用的Android-M,只寫在下面的活動,你想不想短信土司線。

final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1; 


final List<String> permissionsList = new ArrayList<String>(); 
    if (!addPermission(permissionsList, Manifest.permission.RECEIVE_SMS)) 
     permissionsNeeded.add("Receive SMS"); 
    if (!addPermission(permissionsList, Manifest.permission.READ_SMS)) 
     permissionsNeeded.add("Read SMS"); 

    if (permissionsList.size() > 0) { 
     if (permissionsNeeded.size() > 0) { 
      String message = "You need to grant access to " + permissionsNeeded.get(0); 
      for (int i = 1; i < permissionsNeeded.size(); i++) 
       message = message + ", " + permissionsNeeded.get(i); 
      showMessageOKCancel(message, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
         requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
        } 
       } 
      }); 
      return; 
     } 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
     } 
     return; 
    } 

private boolean addPermission(List<String> permissionsList, String permission) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { 
      permissionsList.add(permission); 
      if (!shouldShowRequestPermissionRationale(permission)) 
       return false; 
     } 
    } 
    return true; 
} 

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(OtpActivity.this).setMessage(message).setPositiveButton("OK", okListener).setNegativeButton("Cancel", null).create().show(); 
} 



@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      Map<String, Integer> perms = new HashMap<String, Integer>(); 
      perms.put(Manifest.permission.RECEIVE_SMS, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_SMS, PackageManager.PERMISSION_GRANTED); 
      for (int i = 0; i < permissions.length; i++) 
       perms.put(permissions[i], grantResults[i]); 
      if (perms.get(Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED 
        ) { 
      } else { 
      } 
     } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+0

您正在使用哪個版本的手機?棉花糖? – Drv

+0

是的。我使用棉花糖,但我必須編制API 15及以上版本。 – weirdgyn

+0

因此,在棉花糖,您需要給予使用讀取短信或接收短信權限的運行時權限。 – Drv

0

該問題與應用程序權限有關,但並不需要Drv的所有代碼(抱歉)。 在我的經驗不足中,我遇到了應用程序安裝槽ADB應該具有默認設置所需的所有權限(當然,這對於安全原因而言並不正確)。通過應用程序管理員設置權限解決了問題。 謝謝任何​​人。