广播接收器无法在Android 6.0 Marshmallow中运行

时间:2015-10-09 10:58:10

标签: android broadcastreceiver android-6.0-marshmallow

我刚刚将我的Nexus 5更新为android 6,直到现在我的应用程序运行正常,但现在广播接收器无法正常工作。新版本有什么变化吗? 这是我尝试过的代码,用于以前的版本,但不是在marshmallow -

Android Manifest     

    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS" ></uses-permission>

广播接收器

public String TAG ="someClass";
private static String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equalsIgnoreCase(ACTION_SMS_RECEIVED)) {
        Log.d(TAG, "Received...");
    }
}

服务

Broadcast_receiver broadcast_receiver = new Broadcast_receiver();
IntentFilter filter1 = new IntentFilter();
filter1.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(broadcast_receiver, filter1);

同样,PHONE_STATE的广播接收器也无效。

3 个答案:

答案 0 :(得分:16)

您应用的目标API级别为23,即android M(6.0)。在Android M中,存在与用户权限相关的巨大变化。 Here是解释变化的好文章。

答案 1 :(得分:10)

Android - Requesting Permissions

中所述
  

从Android 6.0(API级别23)开始,用户在应用程序运行时授予应用程序权限,而不是在安装应用程序时授予权限...用户可以随时撤消权限...

它还声明:

  

系统权限分为两类:普通和危险:

     
      
  1. 正常权限不会直接影响用户的隐私。如果您的应用在其清单中列出了正常权限,系统会自动授予权限

  2.   
  3. 危险权限可以让应用访问用户   机密数据。如果你列出   一个危险的许可,用户必须明确批准   你的应用

  4.   

以下是Dangerous PermissionsNormal Permissions

的完整列表

所有这些基本上意味着您需要在实际需要时手动请求任何危险权限。

由于代码中可能需要多次,因此您可以创建一个可重用的方法来检查是否已授予特定权限,如果不是,则从用户请求。

这是一个例子:

<强>爪哇

public class PermissionManager {
    //A method that can be called from any Activity, to check for specific permission
    public static void check(Activity activity, String permission, int requestCode){
        //If requested permission isn't Granted yet 
        if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
            //Request permission from user
            ActivityCompat.requestPermissions(activity,new String[]{permission},requestCode);
        }
    }
}

<强>科特林

object PermissionManager {
    //A method that can be called from any Activity, to check for specific permission
    fun check(activity: Activity, permission: String, requestCode: Int) {
        //If requested permission isn't Granted yet
        if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
            //Request permission from user
            ActivityCompat.requestPermissions(activity, arrayOf(permission), requestCode)
        }
    }
}

用法:

<强>爪哇

//Inside your activity:
//1. Define static constant for each permission request
public static final int REQUEST_CODE_FOR_SMS=1;
//2. When needed (for example inside .onStart event) use method PermissionManager.check for requested permission 
@Override
protected void onStart() {
    super.onStart();
    PermissionManager.check(this, Manifest.permission.RECEIVE_SMS, REQUEST_CODE_FOR_SMS);
}
//3. Handle User's response for your permission request
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if(requestCode==REQUEST_CODE_FOR_SMS){//response for SMS permission request
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
            //What to do if User allowed SMS permission
        }else{
            //What to do if user disallowed requested SMS permission
        }
    }
}

<强>科特林

//Inside your activity:
//1. Define static constant for each permission request
val REQUEST_CODE_FOR_SMS = 1
//2. When needed (for example inside .onStart event) use method PermissionManager.check for requested permission
override fun onStart() {
    super.onStart()
    PermissionManager.check(this, Manifest.permission.RECEIVE_SMS, REQUEST_CODE_FOR_SMS)
}

//3. Handle User's response for your permission request
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    if (requestCode == REQUEST_CODE_FOR_SMS) {//response for SMS permission request
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //What to do if User allowed SMS permission
        } else {
            //What to do if user disallowed requested SMS permission
        }
    }
}

注意:

  1. 如果您需要在Fragment个实例中使用PermissionManager.check,请使用:getActivity()作为其第一个参数。

  2. 您可以在checkSelfPermission实例中使用Service来检查是否已授予某些权限,但不是requestPermissions来请求它。由于checkSelfPermission可用于任何Context,但requestPermissions仅适用于Activity

答案 2 :(得分:3)

Marshmallow阻止了危险的权限。

这并不适用于列出的方案,但它可能对其他人有所帮助。我一直在谈论为什么我们的一些广播接收器没有工作。我们有自定义权限设置并拥有android:protectionLevel="dangerous"。将其更改为android:protectionLevel= "signature",一切都开始有效。