2015-10-09 26 views
12

Tôi vừa cập nhật Nexus 5 của mình lên Android 6, cho đến bây giờ ứng dụng của tôi hoạt động tốt, nhưng giờ đây thiết bị thu phát sóng không hoạt động. Có điều gì đó đã thay đổi trong phiên bản mới? Đây là mã tôi đã cố gắng mà đã làm việc trên các phiên bản trước nhưng không phải trong marshmallow -Máy thu phát không hoạt động trong 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> 

Broadcast Receiver

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..."); 
    } 
} 

Dịch vụ

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

Tương tự như vậy, bộ thu phát sóng cho PHONE_STATE cũng không hoạt động.

+0

sdk max và min của dự án của bạn là gì? –

+0

tối thiểu là 18 và mục tiêu là 23 – Imdad

Trả lời

16

Mức API mục tiêu của ứng dụng của bạn là 23, đó là Android M (6.0). Trong Android M có những thay đổi lớn liên quan đến quyền người dùng. Here là bài viết hay giải thích những thay đổi.

+1

Cảm ơn người đàn ông. OK tại đây - http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html – Imdad

+0

@ Mã chậm phát triển của Jack - Yêu cầu nếu bạn có thể giải thích cách bạn giải quyết vấn đề của mình. Tôi đang đối mặt với cùng một vấn đề chính xác ... Cảm ơn! – Kanchu

+1

@Kanchu bạn cần quyền Thời gian chạy cho Android M, đơn giản tuyên bố nó trong Tệp kê khai sẽ không đủ. Yêu cầu sự cho phép thời gian chạy khi sử dụng tính năng làm cho phép được cấp quyền. Để triển khai các quyền Thời gian chạy, hãy xem hướng dẫn dành cho nhà phát triển Android hoặc chỉ đơn giản là google (nhiều liên kết). – Imdad

3

Marshmallow đang chặn các quyền nguy hiểm.

Điều này không áp dụng cho trường hợp được liệt kê, nhưng nó có thể giúp người khác. Tôi tiếp tục đến SO này vì sao một số Broadcast Receiver của chúng tôi không hoạt động. Chúng tôi có thiết lập quyền tùy chỉnh và có android:protectionLevel="dangerous". Thay đổi nó thành android:protectionLevel= "signature" và mọi thứ bắt đầu hoạt động.

+0

vây cảm ơn của nó. – Jinu

+2

này, tôi đang gặp phải sự cố tương tự. Bạn có thể vui lòng giải thích, nơi chính xác tôi nên sử dụng tuyên bố này? –

10

Như đã nêu trong Android - Requesting Permissions

Bắt đầu từ Android 6.0 (API mức 23), người dùng cấp quyền truy cập vào các ứng dụng trong khi các ứng dụng đang chạy, không phải khi họ cài đặt ứng dụng ... Người dùng có thể thu hồi quyền bất cứ lúc nào ...

Nó cũng tuyên bố rằng:

Hệ điều khoản được chia thành hai loại, bình thường và nguy hiểm:

  1. Quyền bình thường không trực tiếp đe dọa đến quyền riêng tư của người dùng. Nếu ứng dụng của bạn liệt kê quyền bình thường trong tệp kê khai, thì hệ thống sẽ cấp quyền tự động

  2. Quyền nguy hiểm có thể cấp cho ứng dụng quyền truy cập vào dữ liệu bí mật của người dùng. Nếu bạn liệt kê một phép nguy hiểm, người dùng có để cung cấp cho một cách rõ ràng chính để ứng dụng của bạn

Dưới đây là danh sách đầy đủ các Dangerous PermissionsNormal Permissions

Tất cả những gì về cơ bản có nghĩa là bạn cần phải tự yêu cầu cho bất kỳ sự cho phép nguy hiểm nào, khi nó thực sự cần thiết.

Vì nó có khả năng cần nhiều lần trong mã của bạn, bạn có thể tạo một phương pháp có thể tái sử dụng để kiểm tra xem liệu quyền cụ thể có được cấp hay không và nếu không - để yêu cầu từ người dùng.

đây một ví dụ:

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

Cách sử dụng Ví dụ:

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

Lưu ý:

  1. Nếu bạn cần phải sử dụng PermissionManager.check bên Fragment dụ, sử dụng: getActivity() như mệnh lệnh đầu tiên một mét.

  2. Bạn có thể sử dụng checkSelfPermission trong ví dụ Service để kiểm tra xem một số quyền đã được cấp chưa, nhưng không phải là requestPermissions để yêu cầu. Bởi vì checkSelfPermission có thể được sử dụng cho bất kỳ Context, nhưng requestPermissions chỉ cho Activity

+0

Điều này không giống với câu trả lời của vấn đề này. Tôi nghĩ rằng sự cho phép không có gì để làm với chế độ doze và không gọi phát sóng. –

Các vấn đề liên quan