2015-10-09 2 views
12

Я только что обновил свой Nexus 5 до android 6, до сих пор мое приложение работало нормально, но теперь широковещательные приемники не работают. Что-то изменилось в новой версии? Вот код, который я попробовал, что работал в предыдущих версиях, но не в зефира -Broadcast Receivers не работает в Android 6.0 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 также не работает.

+0

Что такое максимум и минимум SDK вашего проекта? –

+0

минимум 18, а цель 23 – Imdad

ответ

16

Уровень API вашего приложения - 23, то есть android M (6.0). В android M есть огромные изменения, связанные с правами пользователя. Here - хорошая статья, объясняющая изменения.

+1

Спасибо человеку. Получил его здесь - http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html – Imdad

+0

@ Замедленный код Джека - запрос, если вы можете объяснить, как вы решили свою проблему. Я столкнулся с той же проблемой ... Спасибо! – Kanchu

+1

@ Kanchu вам нужны разрешения Runtime для Android M, просто объявить его в манифесте будет недостаточно. Запрашивать разрешение на запуск во время использования функции, которая запрашивает разрешение. Чтобы реализовать разрешения Runtime, см. Руководство разработчиков Android или просто Google (много ссылок). – Imdad

3

Marshmallow блокирует опасные разрешения.

Это не относится к указанному сценарию, но может помочь кому-то другому. Я продолжал приходить к этому так, потому что некоторые из наших вещательных приемников не работали. У нас есть настройка пользовательских разрешений и есть android:protectionLevel="dangerous". Изменил его до android:protectionLevel= "signature", и все начало работать.

+0

его работающий плацдарм. – Jinu

+2

эй, я столкнулся с той же проблемой. Не могли бы вы объяснить, где именно я должен использовать это утверждение? –

10

Как указано в Android - Requesting Permissions

Начиная с Android 6.0 (уровень API 23), пользователи предоставлять разрешение приложения в то время как приложение работает, не тогда, когда они установить приложение ... Пользователь может аннулировать разрешения в любое время ...

Он также заявил, что:

Системные требования делятся на две категории, нормальных и опасных:

  1. Нормальные разрешения не имеют прямого риска для конфиденциальности пользователя. Если ваше приложение отображает нормальное разрешение в своем манифесте, система автоматически предоставляет разрешение

  2. Опасные разрешения могут предоставить приложению доступ к конфиденциальным данным пользователя . Если вы перечисляете опасное разрешение, пользователь должен явно дать разрешение на ваше приложение

Вот полные списки Dangerous Permissions и Normal 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); 
     } 
    } 
} 

Использование:

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

Примечание:

  1. Если вам нужно использовать PermissionManager.check внутри Fragment например, использование: getActivity(), как его первый пар ameter.

  2. Вы можете использовать экземпляр checkSelfPermission внутри экземпляра Service, чтобы проверить, предоставлено ли какое-либо разрешение уже, но не requestPermissions, чтобы запросить его. Поскольку checkSelfPermission может быть использован для любого Context, но requestPermissions только для Activity

+0

Это не похоже на ответ этой проблемы. Я думаю, что разрешение не имеет ничего общего с режимом доз и не вызывает трансляцию. –

Смежные вопросы