android marshmallow - SMS_RECEIVED权限

时间:2015-10-26 14:08:31

标签: android-6.0-marshmallow

我最近更新了我的应用程序以支持android 6 marshmallow。 我按照https://developer.android.com/training/permissions/requesting.html

上的说明进行操作

并为Manifest.permission.RECEIVE_SMS添加了requestPermissions。 当我运行以下代码时:

        Log.i(TAG, "sending SMS...");
        Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
        intent.putExtra("pdus", data);

        getContext().sendOrderedBroadcast(intent, null);

我得到了

  

java.lang.SecurityException:Permission Denial:不允许从pid = 1999发送广播android.provider.Telephony.SMS_RECEIVED,uid = 10056

即使我授予SMS_RECEIVED权限,也无法在设备上发送短信广播。

任何想法为什么我在android 6上获得此安全异常。

我的目标是在我的设备链接中生成假短信[can I send "SMS received intent"?  。我没有在谷歌上找到任何不允许的提及。

5 个答案:

答案 0 :(得分:10)

您需要将权限添加到manifest xml:

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

AND ,您需要在运行时请求权限。直到android 6,安装时自动授予权限。在android 6及更高版本中,您可以安装应用程序而不授予权限。您可以在活动类中使用此功能:

private void requestSmsPermission() {
    String permission = Manifest.permission.RECEIVE_SMS;
    int grant = ContextCompat.checkSelfPermission(this, permission);
    if ( grant != PackageManager.PERMISSION_GRANTED) {
        String[] permission_list = new String[1];
        permission_list[0] = permission;
        ActivityCompat.requestPermissions(this, permission_list, 1);
    }
}

- 您的活动。

答案 1 :(得分:2)

Android 6运行时权限android.provider.Telephony.SMS_RECEIVED允许您在系统SMS提供商发送消息时接收该消息。

然而,您试图自己播放该消息。我不确定是否允许,并且您发现不受相同权限的控制。 (事实上​​,我认为它已被锁定在Marshmallow上,因此只有系统能够通知应用程序收到的SMS消息。)

答案 2 :(得分:1)

您需要获得api level 23+的权限,Google会重新设置权限系统,以便应用用户可以在安装您的应用后授予和撤消权限

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;       

  if(Build.VERSION.SDK_INT < 23){
     //your code here
   }else {
    requestContactPermission();
   } 

private void requestContactPermission() {

   int hasContactPermission =ActivityCompat.checkSelfPermission(context,Manifest.permission.RECEIVE_SMS);

   if(hasContactPermission != PackageManager.PERMISSION_GRANTED ) {
    ActivityCompat.requestPermissions(Context, new String[]   {Manifest.permission.RECEIVE_SMS}, PERMISSION_REQUEST_CODE);
   }else {
    //Toast.makeText(AddContactsActivity.this, "Contact Permission is already granted", Toast.LENGTH_LONG).show();
     }
}


@Override
public void onRequestPermissionsResult(int requestCode, String[]           permissions, int[] grantResults) {
switch (requestCode) {
    case REQUEST_CODE_ASK_PERMISSIONS:
        // Check if the only required permission has been granted
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.i("Permission", "Contact permission has now been granted. Showing result.");
            Toast.makeText(this,"Contact Permission is Granted",Toast.LENGTH_SHORT).show();
        } else {
            Log.i("Permission", "Contact permission was NOT granted.");
         } 
         break;
  }
}

答案 3 :(得分:0)

Android 6.0 / SDK 23引入了一种新的请求权限的方式。

您需要请求SMS权限,请参阅以下链接以了解如何处理权限:

https://developer.android.com/training/permissions/index.html

答案 4 :(得分:0)

安装后,您必须为您的应用授予SMS权限。去吧 设置&gt;应用&gt; Your_app&gt;权限 然后授予所需的权限。