Quyền Android M: onRequestPermissionsResult () không được gọi


291

Tôi đang cập nhật ứng dụng của mình để sử dụng hệ thống cấp phép thời gian chạy M mới. Tất cả đều hoạt động ngoại trừ onRequestPermissionsResult (). Tôi cần kiểm tra quyền trên một lần nhấn nút và nếu thành công, hãy gửi tin nhắn văn bản. Khi tôi cấp quyền để thực hiện, hộp thoại sẽ đóng, nhưng nó không kích hoạt Gửi văn bản cho đến khi tôi nhấn nút một lần nữa.

Tôi đã gỡ lỗi và đặt các điểm dừng trong phương thức onRequestPermissionsResult () nhưng nó không bao giờ đi vào nó.

Phương thức này được gọi đầu tiên:

    private void askForPermission() {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

Và sau đó cuộc gọi lại của tôi trông như thế này:

    @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == PERMISSIONS_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            int grantResult = grantResults[i];

            if (permission.equals(Manifest.permission.SEND_SMS)) {
                if (grantResult == PackageManager.PERMISSION_GRANTED) {
                    onPPSButtonPress();
                } else {
                    requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
                }
            }
        }
    }
}

Có ai gặp phải một vấn đề tương tự? Đánh giá cao bất kỳ trợ giúp với điều này. Cảm ơn

Câu trả lời:


576

Tôi gặp vấn đề tương tự và tôi chỉ tìm thấy giải pháp. Khi sử dụng thư viện Hỗ trợ, bạn phải sử dụng các cuộc gọi phương thức chính xác. Ví dụ:

  • Khi ở AppCompatActivity , bạn nên sử dụng ActivityCompat.requestPermissions ;
  • Khi ở trong android.support.v4.app.Fragment , bạn chỉ nên sử dụng requestPermissions (đây là một phương thức ví dụ của android.support.v4.app.Fragment)

Nếu bạn gọi ActivityCompat.requestPermissions trong một đoạn, cuộc gọi lại onRequestPermissionsResult được gọi trên hoạt động chứ không phải đoạn.

Hi vọng điêu nay co ich!


13
Nó cũng xảy ra với các hoạt động noHistory: code.google.com/p/android-developer-preview/issues/
mẹo

11
"Khi ở trong android.support.v4.app.Fragment, bạn nên sử dụng requestPermissions đơn giản" - cảm ơn bạn!
Tigran Sarkisian

5
@AnthonyBobenrieth vậy giải pháp ở đây cho các hoạt động noHistory là gì? Chúng tôi chỉ đơn giản là không thể yêu cầu quyền từ họ?
Dean Wild

2
Liên kết bị hỏng @AnthonyBobenrieth. Có giải pháp nào cho lịch sử không?
fersarr

3
Khi sử dụng Fragment.requestPermissions(), Hoạt động chính thực sự nhận được onRequestPermissionsResult(). (Đây là với thư viện hỗ trợ 23.3.0)
Ai đó ở đâu đó vào

101

Bạn có thể thử điều này:

requestPermissions(permissions, PERMISSIONS_CODE);

Nếu bạn đang gọi mã này từ một đoạn thì nó có phương thức requestPermissions của riêng nó. Tôi tin rằng vấn đề là bạn đang gọi phương thức tĩnh.

Mẹo chuyên nghiệp nếu bạn muốn onRequestPermissionsResult()trong một đoạn: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)


Cảm ơn đã giúp đỡ. Tôi đã nhận thấy rằng có một phương thức requestPermissions nếu nó nằm trong một đoạn. Tôi đang ở trong một đoạn và tôi đã thử gọi chỉ requestPermissions, tiếc là nó không hoạt động. Tôi cũng đã thử những gì bạn đề cập và nó cũng không hoạt động.
AndyOHart

Điều này làm việc cho tôi trong Android M. Nhưng chỉ tự hỏi liệu nó có gây ra sự cố nào trong các thiết bị Pre-M không?
Bala Vishnu

4
@goodgamerguy đảm bảo bạn không sử dụng mã yêu cầu trong onRequestPermissionsResult của hoạt động. nếu hoạt động của bạn cũng sử dụng gọi lại onRequestPermissionsResult, bạn nên cung cấp mặc định: super.onRequestPermissionsResult (requestCode, allow, GrantResults);
Timmy Simons

68

Tôi hy vọng nó hoạt động tốt

Đối với hoạt động:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

Đối với mảnh vỡ:

 requestPermissions(permissionsList,REQUEST_CODE);

Còn SDK 15 trở xuống thì sao?
zulkarnain shah

4
Bạn không cần sự cho phép về SDK 15, chỉ có Marshmallow và phiên bản cao hơn mới cần ..
Sanjay Mangaroliya

50

Tôi cũng gặp phải vấn đề này Nếu bạn muốn hoạt động xử lý các quyền không có trong lịch sử / lần ẩn, thì bạn sẽ muốn thay đổi AndroidManifest.xmlmục nhập của mình .

Nếu bạn đặt hoạt động mà bạn gọi requestPermissionshoặc AppCompatActivity.requestPermissionsvới

android:noHistory="true"
android:excludeFromRecents="true"

AndroidManifest.xmlsau đó của bạn onRequestPermissionsResult()sẽ không được gọi. Điều này đúng nếu Hoạt động của bạn có nguồn gốc từ Activityhoặc AppCompatActivity.

Điều này có thể được khắc phục bằng cách xóa cả hai cờ khỏi 'AndroidManifest.xml' và finishAndRemoveTask()thay vào đó kết thúc hoạt động của bạn .


Tôi thà không phải loại bỏ thuộc tính noHistory, nhưng đây là giải pháp hiệu quả với tôi. Cảm ơn!
Eric Schlenz

1
Tôi đã gặp sự cố trên Marshmallow nhưng không phải trên Nougat, cảm ơn vì nó đã giúp ích cho tôi
Yohan Dahmani

37

Nếu bạn có onRequestPermissionsResultcả hoạt động và phân đoạn, hãy đảm bảo gọi super.onRequestPermissionsResulttrong hoạt động. Nó không được yêu cầu trong đoạn, nhưng nó là trong hoạt động.


Ngoài ra, lưu ý rằng nếu bạn nhắm mục tiêu API (chẳng hạn như 19 chẳng hạn), bạn vẫn sẽ thuộc hệ thống mô hình cấp phép cũ và do đó, không nhận được các cuộc gọi chức năng liên quan đến quyền yêu cầu
Bonatti

hãy xem câu trả lời của tôi nếu bạn đã mở rộng một hoạt động khác không gọi là siêu
TouchBoarder

3
Tình cờ gặp phải điều này. FragmentActivity.onRequestPermissionsResult(..)là nơi mà cuộc gọi đến đoạn onRequestPermissionsResult(..)được chuyển tiếp đến.
JanPl

@Bonatti Vì vậy, nếu tôi cố gắng yêu cầu quyền trong Android 4.4.2, tôi sẽ không nhận được kết quả? Vì vậy, tôi không thể thay đổi các quyền, chỉ nhìn thấy chúng?
Alex Fragotsis

@AlexanderFragotsis Bạn sẽ nhận được kết quả. Chỉ khác là bạn sẽ không được yêu cầu cấp quyền, thay vào đó bạn sẽ được hệ thống tự động cấp.
Dusan Zivkovic

33

Trả lời không dùng nữa, vui lòng tham khảo: https://developer.android.com/training/permissions/requesting

Bên trong đoạn, bạn cần gọi:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

Không phải:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);

2
Liên quan đến android.support.v13.app.FragmentCompat
Udi Oshi

1
FragmentCompat không được dùng nữa kể từ API 27.1.0.
Big McLUNDHuge

câu trả lời của tôi không được chấp nhận, vui lòng tham khảo: developer.android.com/training/permissions/requesting
Ben.Slama.Jihed

15

Nếu bạn đang sử dụng requestPermissions trong đoạn, nó chấp nhận 2 tham số thay vì 3.

Bạn nên sử dụng requestPermissions(permissions, PERMISSIONS_CODE);


1
Trên thực tế, nó cung cấp một câu trả lời cho câu hỏi. Gọi requestPermissions (phương thức phân đoạn) thay vì ActivityCompat.requestPermissions, phương thức kết quả được kích hoạt. Đó là vấn đề chính ở đây. Cảm ơn Don
Waclock

15

Nếu vì một lý do nào đó, bạn đã mở rộng một Hoạt động tùy chỉnh nằm trong một số thư viện bên ngoài không gọi siêu, bạn sẽ cần gọi thủ công Fragment super.onRequestPermissionsResult trong Activity onRequestPermissionsResult của bạn.

YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestingFragment!=null)
            requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
...

12

Bạn có chức năng checkPermissions cho các thiết bị Marshmallow trước trong FragmentCompat . Tôi sử dụng như thế này:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

2
Điều này chỉ hoạt động nếu quyền được yêu cầu bên trong android.app.fragment và bạn phải nhập thư viện support-v13!
MohammadReza

4
FragmentCompat.requestPermissions () không hoạt động với android.support.v4.app.Fragment. Bất cứ ai cũng biết làm thế nào để xử lý việc này.
Jutikorn

12

Tôi đã phát hiện ra rằng điều quan trọng là nơi bạn gọi android.support.v4.app.Fragment.requestPermissions .

Nếu bạn làm điều đó trong onCreate(),onRequestPermissionsResult() không bao giờ được gọi.

Giải pháp: Gọi nó vào onActivityCreated();

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) 
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);

}

1
Tôi đang đối mặt với cùng một vấn đề nhưng tôi không thể nhận được onActivityCreated()mã của mình. SDK 23.
kAmol 23/2/2016


Tôi không bị phân mảnh, tôi đang cố gắng thực hiện trên onCreate của một hoạt động
kAmol

Hmm, hay sử dụng onPause()?
almisoft

10

Vấn đề này thực sự đã được gây ra bởi NestedFragments. Về cơ bản hầu hết các đoạn chúng tôi đã mở rộng một HostedFragment, lần lượt mở rộng một CompatFragment. Có các đoạn lồng nhau này gây ra các vấn đề mà cuối cùng đã được giải quyết bởi một nhà phát triển khác trong dự án.

Anh ấy đã làm một số thứ cấp thấp như chuyển bit để làm việc này vì vậy tôi không chắc lắm về giải pháp cuối cùng thực sự


Điều này giúp tôi giải quyết vấn đề của mình: Tôi đã phải chuyển hướng onRequestPermissionsResult từ đoạn cha mẹ sang đoạn con (lồng nhau). Cảm ơn vì tiền hỗ trợ!
Murphy

9
 /* use the object of your fragment to call the 
 * onRequestPermissionsResult in fragment after
 * in activity and use different request Code for 
 * both Activity and Fragment */

   if (isFragment)
    mFragment.requestPermissions(permissions.toArray(new
    String[permissions.size()]),requestPermission);

   else
    ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
    String[permissions.size()]),requestPermission);

6

Điều này sẽ làm việc ..

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

siêu thực hiện gọi việc triển khai phân đoạn không phải là khung hte
Mohammad Yahia

5

Nếu bạn đang gọi mã này từ một đoạn thì nó có phương thức requestPermissions của riêng nó.

Vì vậy, khái niệm cơ bản là, Nếu bạn đang ở trong một Hoạt động, hãy gọi

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

và nếu trong một mảnh, chỉ cần gọi

requestPermissions(permissionsList,
                            permissionscode);

1
Yêu cầu API cấp 23 ... Trên những người trước đó sử dụng FragmentCompat.requestPermissions().
Minas Mina

5

Tôi gặp vấn đề tương tự ngoại trừ tôi đang nhấn nút để thực hiện cuộc gọi, điều này sẽ kích hoạt callIntent. Tôi đã kiểm tra quyền trước, nếu không được cấp, tôi xin phép và onRequestPermissionResult tôi gọi quyền kiểm tra và gọi lại.

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
            if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                checkPermissionsAndCall();
            }
        }
    }
}

public void checkPermissionsAndCall(){
    if (Build.VERSION.SDK_INT > 22) {
        if(ContextCompat.checkSelfPermission(getContext(),
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
        }
        else{
            callIntent();
        }
    }
}


2

Trước khi bạn kiểm tra mọi thứ theo các câu trả lời ở trên, hãy đảm bảo mã yêu cầu của bạn không phải là 0 !!!

kiểm tra mã của onRequestPermissionsResult () trong FragmentActivity.java:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    int index = (requestCode>>16)&0xffff;
    if (index != 0) {
        index--;

        String who = mPendingFragmentActivityResults.get(index);
        mPendingFragmentActivityResults.remove(index);
        if (who == null) {
            Log.w(TAG, "Activity result delivered for unknown Fragment.");
            return;
        }
        Fragment frag = mFragments.findFragmentByWho(who);
        if (frag == null) {
            Log.w(TAG, "Activity result no fragment exists for who: " + who);
        } else {
            frag.onRequestPermissionsResult(requestCode&0xffff, permissions, grantResults);
        }
    }
}

2
private void showContacts() {
    if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {
        doShowContacts();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        doShowContacts();
    }
}

2

Tôi có một giải pháp tuyệt vời để đạt được điều này tạo nên một BaseActivity như thế này.

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                CustomToast.getInstance().setCustomToast("Now you can share the Hack.");

            } else {
                Toast.makeText(this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

}

Bây giờ bạn có thể gọi mã để xin phép như thế này

 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

Bây giờ mỗi khi điều này xảy ra ở bất cứ đâu dù là trong đoạn của bạn hay trong bất kỳ hoạt động nào thì hoạt động cơ sở sẽ được gọi.

Cảm ơn


1

Bạn có thể sử dụng requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);. Không sử dụng FragmentCompat nếu bạn đang sử dụng v4.


Xin hãy giải thích tại sao.
placeable

1

Chi tiết

  • Kotlin 1.2,70
  • kiểm tra trong minSdkVersion 19
  • Xưởng Android 3.1.4

Thuật toán

mô-đun - máy ảnh, vị trí, ....

  1. Kiểm tra xem hasSystemFeature (nếu mô-đun tồn tại trong điện thoại)
  2. Kiểm tra xem người dùng có quyền truy cập vào mô-đun không
  3. Gửi yêu cầu quyền (yêu cầu người dùng cho phép sử dụng mô-đun )

Đặc trưng

  1. Làm việc với các hoạt động và các mảnh
  2. Chỉ có một phản hồi kết quả
  3. Có thể kiểm tra một số mô-đun trong một yêu cầu

Giải pháp

class PermissionType(val manifest_permission: String, val packageManager: String) {
    object Defined {
        val camera = PermissionType(Manifest.permission.CAMERA, PackageManager.FEATURE_CAMERA)
        val currentLocation = PermissionType(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.FEATURE_LOCATION_GPS)
    }
}

class  Permission {

    enum class PermissionResult {
        ACCESS_ALLOWED, ACCESS_DENIED, NO_SYSTEM_FEATURE;
    }

    interface ManagerDelegate {
        fun permissionManagerDelegate(result: Array<Pair<String, PermissionResult>>)
    }

    class Manager internal constructor(private val delegate: ManagerDelegate?) {

        private var context: Context? = null
        private var fragment: Fragment? = null
        private var activity: AppCompatActivity? = null
        private var permissionTypes: Array<PermissionType> = arrayOf()
        private val REQUEST_CODE = 999
        private val semaphore = Semaphore(1, true)
        private var result: Array<Pair<String, PermissionResult>> = arrayOf()


        constructor(permissionType: PermissionType, delegate: ManagerDelegate?): this(delegate) {
            permissionTypes = arrayOf(permissionType)
        }

        constructor(permissionTypes: Array<PermissionType>, delegate: ManagerDelegate?): this(delegate) {
            this.permissionTypes = permissionTypes
        }

        init {
            when (delegate) {
                is Fragment -> {
                    this.fragment = delegate
                    this.context = delegate.context
                }

                is AppCompatActivity -> {
                    this.activity = delegate
                    this.context = delegate
                }
            }
        }

        private fun hasSystemFeature(permissionType: PermissionType) : Boolean {
            return context?.packageManager?.hasSystemFeature(permissionType.packageManager) ?: false
        }

        private fun hasAccess(permissionType: PermissionType) : Boolean {
            return if (Build.VERSION.SDK_INT < 23) true else {
                context?.checkSelfPermission(permissionType.manifest_permission) == PackageManager.PERMISSION_GRANTED
            }
        }

        private fun sendRequest(permissionTypes: Array<String>) {

            if (fragment != null) {
                fragment?.requestPermissions(permissionTypes, REQUEST_CODE)
                return
            }

            if (activity != null){
                ActivityCompat.requestPermissions(activity!!, permissionTypes, REQUEST_CODE)
            }
        }

        fun check() {

            semaphore.acquire()
            AsyncTask.execute {
                var permissionsForSendingRequest: Array<String> = arrayOf()
                this.result = arrayOf()

                for (it in permissionTypes) {
                    if (!hasSystemFeature(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.NO_SYSTEM_FEATURE)
                        continue
                    }

                    if (hasAccess(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                    } else {
                        permissionsForSendingRequest += it.manifest_permission
                    }
                }

                if (permissionsForSendingRequest.isNotEmpty()) {
                    sendRequest(permissionsForSendingRequest)
                } else {
                    delegate?.permissionManagerDelegate(result)
                }
            }
        }

        fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
            when (requestCode) {
                REQUEST_CODE -> {
                    if (grantResults.isEmpty()) {
                        return
                    }
                    for ((i,permission) in permissions.withIndex()) {
                        for (item in this.permissionTypes) {
                            if (permission == item.manifest_permission && i < grantResults.size) {
                                result += if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                                } else {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_DENIED)
                                }
                                break
                            }
                        }
                    }
                    delegate?.permissionManagerDelegate(result)
                }
            }
            semaphore.release()
        }
    }
}

Cách sử dụng trong Hoạt động (trong đoạn giống nhau)

class BaseActivity : AppCompatActivity(), Permission.ManagerDelegate {

    private lateinit var permissionManager: Permission.Manager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.base_activity)

        permissionManager = Permission.Manager(arrayOf(PermissionType.Defined.camera, PermissionType.Defined.currentLocation), this)
        permissionManager.check()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        permissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    override fun permissionManagerDelegate(result: Array<Pair<String, Permission.PermissionResult>>) {
        result.forEach {
            println("!!! ${it.first} ${it.second}")
//            when (it.second) {
//                Permission.PermissionResult.NO_SYSTEM_FEATURE -> {
//                }
//
//                Permission.PermissionResult.ACCESS_DENIED  -> {
//                }
//
//                Permission.PermissionResult.ACCESS_ALLOWED -> {
//                }
//            }
        }
    }
}

1

Ở đây tôi muốn hiển thị mã của mình cách tôi quản lý này.

public class CheckPermission {

public Context context;

public static final int PERMISSION_REQUEST_CODE =  200;

public CheckPermission(Context context){
    this.context = context;
}

public boolean isPermissionGranted(){
    int read_contact = ContextCompat.checkSelfPermission(context.getApplicationContext() , READ_CONTACTS);
    int phone = ContextCompat.checkSelfPermission(context.getApplicationContext() , CALL_PHONE);

    return read_contact == PackageManager.PERMISSION_GRANTED && phone == PackageManager.PERMISSION_GRANTED;
   }
}

Ở đây trong lớp này tôi muốn kiểm tra cấp phép hay không. Không phải sau đó tôi sẽ gọi sự cho phép từ MainActivity của tôi như

public void requestForPermission() {
       ActivityCompat.requestPermissions(MainActivity.this, new String[]    {READ_CONTACTS, CALL_PHONE}, PERMISSION_REQUEST_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
                    showMessageOKCancel("You need to allow access to both the permissions",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE},
                                                PERMISSION_REQUEST_CODE);
                                    }
                                }
                            });
                    return;
                }
            }
    }
}

Bây giờ trong phương thức onCreate, bạn cần gọi hàm requestForPermission ().

Đó là nó. Ngoài ra, bạn có thể yêu cầu nhiều sự cho phép cùng một lúc.


1

CẬP NHẬT: đã thấy câu trả lời của người khác về cách gọi super.onRequestPermissionResult()trong Hoạt động và khắc phục sự cố mã yêu cầu mà tôi đã đề cập và gọi đoạn này là onRequestPermissionResult.

bỏ qua những thứ này:

Đối với tôi, nó được gọi onRequestPermissionResultlà Hoạt động mặc dù tôi gọifragment.requestPermission(...) , NHƯNG nó đã trả về kết quả với mã yêu cầu không chính xác (111 biến thành 65647 tại sao ??? Tôi sẽ không bao giờ biết).

May mắn thay, đây là quyền duy nhất chúng tôi yêu cầu trên màn hình đó vì vậy tôi chỉ bỏ qua mã yêu cầu (không có thời gian để tìm hiểu tại sao nó không chính xác ngay bây giờ)


Thêm 65536 và 111 và bạn sẽ nhận được nó. Điều này là do mặt nạ bit. Xem một số chủ đề.
CoolMind

0

Tôi cũng đã gặp một vấn đề mà ngay cả khi bạn gọi requestPermissions chính xác, bạn vẫn có thể gặp vấn đề này. Vấn đề là hoạt động cha mẹ có thể ghi đè phương thức này mà không gọi siêu. Thêm siêu và nó sẽ được sửa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.