web-dev-qa-db-ja.com

Android 6.0 Marshmallowでブロードキャストレシーバーが機能しない

Nexus 5をAndroid 6にアップデートしました。これまで、アプリは正常に動作していましたが、放送受信機は動作していません。新しいバージョンで何か変更はありますか?ここで試したコードは次のとおりです。以前のバージョンでは機能しましたが、マシュマロでは機能しませんでした-

Androidマニフェスト

    <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のブロードキャストレシーバーも機能していません。

13
Imdad

アプリのターゲットAPIレベルは23、つまりAndroid M(6.0)です。Android Mでは、ユーザー権限に関連する大きな変更があります。 ここ は変更を説明する素晴らしい記事です。

16

Android-権限のリクエスト で述べたように

Android 6.0(APIレベル23)から)、ユーザーはアプリのインストール時ではなく、アプリの実行中にアプリに権限を付与します...ユーザーはいつでも権限を取り消すことができます。 。

それはまた述べられています:

システム権限は、通常と危険の2つのカテゴリに分かれています。

  1. 通常の権限は、ユーザーのプライバシーを直接危険にさらしません。アプリがマニフェストに通常の権限をリストしている場合、システムは自動的に権限を付与します

  2. 危険な権限により、アプリがユーザーの機密データにアクセスできる可能性があります。危険な権限をリストした場合、ユーザーはアプリに明示的に承認を与える必要があります

危険な権限通常の権限 の完全なリストを以下に示します。

これは基本的に、実際に必要なときに、危険な許可を手動で要求する必要があることを意味します。

コード内で複数回必要になる可能性があるため、特定の権限が既に付与されているかどうかを確認し、付与されていない場合はユーザーから要求するための再利用可能なメソッドを作成できます。

ここに例を示します:

Java

_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);
        }
    }
}
_

Kotlin

_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)
        }
    }
}
_

使用法:

Java

_//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
        }
    }
}
_

Kotlin

_//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にも使用できますが、requestPermissionsActivityにのみ使用できます

10
Nikita Kurtin

マシュマロは危険な許可をブロックしています。

これはリストされているシナリオには適用されませんが、他の誰かを助けるかもしれません。私はこれにアクセスし続けましたSO一部のブロードキャストレシーバーが機能しなかった理由。カスタムのアクセス許可が設定されており、Android:protectionLevel="dangerous"がありました。これをAndroid:protectionLevel= "signature"に変更しましたすべてが働き始めました。

3
FinHead