2015-10-26 160 views
1

我最近更新了我的应用程序以支持android 6棉花糖。 我遵循https://developer.android.com/training/permissions/requesting.html的说明android棉花糖 - SMS_RECEIVED权限

并为Manifest.permission.RECEIVE_SMS添加了requestPermissions。 当IM下执行如下代码:

 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异常:权限拒绝:不允许从PID = 1999发送广播android.provider.Telephony.SMS_RECEIVED,UID = 10056

即使我授予SMS_RECEIVED权限,我不能在设备上发送短消息广播。

任何想法,为什么我得到在Android 6.

我的目标这个安全例外是在我的设备链接[can I send "SMS received intent"? 生成假的短信。我没有发现任何提及谷歌,它不再允许。

+0

if(ContextCompat.checkSelfPermission(activity,Manifest.permission。RECEIVE_SMS)== PackageManager.PERMISSION_GRANTED) – Nepster

+0

尝试这可能是工作http://stackoverflow.com/a/41221852/5488468 –

回答

0

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

您需要请求短信的权限,请参阅下面的如何处理权限的链接:

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

+0

正如我所说我遵循指示,并添加了SMS_RECEIVED权限。我得到“不允许发送广播android.provider.Telephony.SMS_RECEIVED” – Jonny

+0

添加或请求?两个不同的东西。添加清单权限不起作用 – AndroidEnthusiast

+0

定期的SDK应用程序无法拥有发送“SMS_RECEIVED”广播所需的权限。它可以成功请求的任何SMS权限在此无济于事。 –

2

Android的6运行许可android.provider.Telephony.SMS_RECEIVED给你权限收到该消息发送时由系统SMS提供商提供。

但是,您正试图自己广播该消息。我不确定这是否被允许,并且您发现不受相同权限的控制。 (事实上​​,我假设它已被锁定在棉花糖上,以便只有系统能够通知收到的短信消息的应用程序)。

+0

我的目标是在我的设备中生成一个假的短信http://stackoverflow.com/questions/12489716/can-i-send-sms-received-intent。我没有发现任何提及谷歌,它不再允许。你有另一个sugest如何我可以在我的应用程序中生成一个假的短信? – Jonny

0

安装后,您必须将SMS权限授予您的应用程序。只需进入 设置>应用程序> Your_app>权限 然后授予所需的权限。

+0

常规SDK应用程序无法拥有发送“SMS_RECEIVED”广播所需的权限。在应用程序设置中启用SMS权限将无济于事。 –

0

您需要的API级23+许可,谷歌修改了许可制度,因此该应用的用户可以授予和安装应用程式后撤消权限

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; 
    } 
} 
+0

可否请您添加一些解释? – slfan

+0

RejoylinLokeshwaran有没有这样的许可“Manifest.permission.SMS_RECEIVED” – Jonny

+0

对不起,它是Manifest.permission.RECEIVE_SMS – RejoylinLokeshwaran

6

你需要允许添加到清单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); 
    } 
} 

- 你的活动。

+0

OP并不是真的试图在这里接收消息。他们试图发送一个'SMS_RECEIVED'广播来伪造传入消息。 'RECEIVE_SMS'权限在这里没有帮助。 –