Izin Android M: onRequestPermissionsResult () tidak dipanggil

291

Saya memperbarui aplikasi kami untuk menggunakan sistem izin runtime M baru. Semuanya berfungsi kecuali untuk onRequestPermissionsResult (). Saya perlu memeriksa izin pada tombol tekan, dan jika itu berhasil, kirim pesan teks. Ketika saya memberikan izin untuk melakukannya, dialog ditutup, tetapi tidak memicu Kirim Teks sampai saya menekan tombol lagi.

Saya telah men-debug dan menetapkan breakpoints dalam metode onRequestPermissionsResult () tetapi tidak pernah masuk ke dalamnya.

Metode ini dipanggil pertama:

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

Dan kemudian panggilan balik saya terlihat seperti ini:

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

Adakah yang mengalami masalah serupa? Hargai bantuan apa pun dengan ini. Terima kasih

AndyOHart
sumber

Jawaban:

576

Saya mengalami masalah yang sama dan saya baru saja menemukan solusinya. Saat menggunakan perpustakaan Dukungan, Anda harus menggunakan metode panggilan yang benar. Sebagai contoh:

  • Saat di AppCompatActivity , Anda harus menggunakan ActivityCompat.requestPermissions ;
  • Ketika di android.support.v4.app.Fragment , Anda harus menggunakan cukup requestPermissions (ini adalah metode instance dari android.support.v4.app.Fragment)

Jika Anda memanggil ActivityCompat.requestPermissions dalam sebuah fragmen, callback onRequestPermissionsResult dipanggil pada aktivitas dan bukan fragmen.

Semoga ini membantu!

yavor87
sumber
13
Ini juga terjadi dengan kegiatan noHistory: code.google.com/p/android-developer-preview/issues/…
Anthony Bobenrieth
11
"Ketika di android.support.v4.app.Fragment, Anda harus menggunakan hanya requestPermissions" - terima kasih!
Tigran Sarkisian
5
@AnthonyBobenrieth jadi apa solusinya di sini untuk kegiatan noHistory? Kami tidak bisa meminta izin dari mereka?
Dean Wild
2
Tautannya rusak @AnthonyBobenrieth. Apakah ada solusi tanpa sejarah?
fersarr
3
Saat menggunakan Fragment.requestPermissions(), Aktivitas induk sebenarnya menerima onRequestPermissionsResult(). (Ini dengan perpustakaan dukungan 23.3.0)
Seseorang di suatu tempat
101

Anda dapat mencoba ini:

requestPermissions(permissions, PERMISSIONS_CODE);

Jika Anda memanggil kode ini dari sebuah fragmen, ia memiliki metode requestPermissions sendiri. Saya percaya masalahnya adalah Anda memanggil metode statis.

Kiat Pro jika Anda menginginkan bagian onRequestPermissionsResult()dalam: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)

Tieru
sumber
Terima kasih untuk bantuannya. Saya memang memperhatikan bahwa ada metode requestPermissions jika dalam fragmen. Saya berada di sebuah fragmen dan saya mencoba menelepon hanya requestPermissions, sayangnya itu tidak berhasil. Saya juga mencoba apa yang Anda sebutkan dan juga tidak berhasil.
AndyOHart
Ini bekerja untuk saya di Android M. Tapi hanya ingin tahu apakah itu akan menyebabkan masalah dalam perangkat Pra-M?
Bala Wisnu
4
@goodgamerguy pastikan Anda tidak menggunakan kode permintaan di onRequestPermissionsResult kegiatan jika aktivitas Anda juga menggunakan panggilan balik onRequestPermissionsResult Anda harus memberikan default: super.onRequestPermissionsResult (requestCode, izin, grantResult);
Timmy Simons
68

Saya harap ini berfungsi dengan baik

Untuk Aktivitas:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

Untuk Fragmen:

 requestPermissions(permissionsList,REQUEST_CODE);
Sanjay Mangaroliya
sumber
Bagaimana dengan SDK 15 dan lebih rendah?
zulkarnain shah
4
Anda tidak perlu izin tentang SDK 15, hanya Marshmallow dan versi di atas yang perlu ..
Sanjay Mangaroliya
50

Saya juga mengalami masalah ini. Jika Anda ingin aktivitas yang menangani izin tidak ada dalam sejarah / akhir-akhir ini, maka Anda akan tergoda untuk mengubah AndroidManifest.xmlentri Anda .

Jika Anda mengatur aktivitas yang Anda panggil requestPermissionsatau AppCompatActivity.requestPermissionsdengan

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

di AndroidManifest.xmlkemudian Anda onRequestPermissionsResult()tidak akan dipanggil. Ini benar jika Aktivitas Anda berasal dari Activityatau AppCompatActivity.

Ini dapat diperbaiki dengan menghapus kedua flag dari 'AndroidManifest.xml' dan menyelesaikan aktivitas Anda finishAndRemoveTask()sebagai gantinya.

Simon Featherstone
sumber
Saya lebih suka tidak harus menghapus atribut noHistory, tetapi ini adalah solusi yang bekerja untuk saya. Terima kasih!
Eric Schlenz
1
Saya memiliki masalah pada Marshmallow tetapi tidak pada Nougat, terima kasih itu berhasil untuk saya
Yohan Dahmani
37

Jika Anda memiliki onRequestPermissionsResultaktivitas dan fragmen, pastikan untuk memanggil super.onRequestPermissionsResultaktivitas. Tidak diperlukan dalam fragmen, tetapi dalam aktivitas.

Dusan Zivkovic
sumber
Juga, perhatikan bahwa jika Anda menargetkan API (misalnya 19 misalnya), Anda masih akan berada di bawah sistem model izin yang lama, dan karenanya, tidak menerima permintaan panggilan fungsi terkait izin
Bonatti
lihat jawaban saya jika Anda telah memperpanjang aktivitas lain yang tidak memanggil super
TouchBoarder
3
Menemukan yang satu ini. FragmentActivity.onRequestPermissionsResult(..)adalah tempat pemanggilan fragmen onRequestPermissionsResult(..)diteruskan ke.
JanPl
@Bonatti Jadi jika saya mencoba meminta izin di Android 4.4.2 saya tidak akan mendapatkan hasil? Jadi saya tidak bisa mengubah izin, hanya melihatnya?
Alex Fragotsis
@AlexanderFragotsis Anda akan mendapatkan hasilnya. Satu-satunya perbedaan adalah Anda tidak akan diminta untuk memberikan izin, sebaliknya Anda akan secara otomatis diberikan oleh sistem.
Dusan Zivkovic
33

Jawaban sudah usang silakan merujuk ke: https://developer.android.com/training/permissions/requesting

Di dalam fragmen, Anda perlu menelepon:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

Tidak:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);
Ben.Slama.Jihed
sumber
2
Berkaitan dengan android.support.v13.app.FragmentCompat
Udi Oshi
1
FragmentCompat sudah tidak digunakan lagi pada API 27.1.0.
Big McLargeHuge
jawaban saya sudah usang, silakan merujuk ke: developer.android.com/training/permissions/requesting
Ben.Slama.Jihed
15

Jika Anda menggunakan requestPermissions dalam fragmen, ia menerima 2 parameter alih-alih 3.

Kamu harus menggunakan requestPermissions(permissions, PERMISSIONS_CODE);

AkKi
sumber
1
Sebenarnya itu memang memberikan jawaban untuk pertanyaan itu. Memanggil requestPermissions (misalnya metode fragmen) alih-alih ActivityCompat.requestPermissions, metode hasil dipicu. Yang merupakan masalah utama di sini. Terima kasih Don
Waclock
15

Jika karena alasan tertentu Anda telah memperpanjang Aktivitas kustom yang terletak di beberapa pustaka eksternal yang tidak memanggil super, Anda perlu memanggil super Fragmen secara manual. Hubungi kembali permintaan Anda di aktivitas Anda diRequestPermissionsResult.

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);
    }
...
TouchBoarder
sumber
12

Anda memiliki fungsi checkPermissions untuk perangkat Marshmallow pra di FragmentCompat . Saya menggunakan seperti ini:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
Marta Rodriguez
sumber
2
Ini hanya berfungsi jika izin diminta di dalam android.app.fragment, dan Anda harus mengimpor perpustakaan dukungan-v13!
MohammadReza
4
FragmentCompat.requestPermissions () tidak berfungsi dengan android.support.v4.app.Fragment. Ada yang tahu cara menangani ini.
Jutikorn
12

Saya telah menemukan bahwa itu penting di mana Anda menelepon android.support.v4.app.Fragment.requestPermissions.

Jika Anda melakukannya onCreate(),onRequestPermissionsResult() tidak pernah dipanggil.

Solusi: Sebut saja 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);

}
almisoft
sumber
1
Saya menghadapi masalah yang sama tetapi saya tidak bisa mendapatkan onActivityCreated()kode saya. SDK 23.
kAmol
Saya tidak dalam fragmen, saya mencoba untuk melakukannya di onCreate dari suatu kegiatan
kAmol
Hmm, atau gunakan onPause()?
almisoft
10

Masalah ini sebenarnya disebabkan oleh NestedFragments. Pada dasarnya sebagian besar fragmen kami telah memperpanjang HostedFragment yang pada gilirannya memperluas CompatFragment. Memiliki fragmen bersarang ini menyebabkan masalah yang akhirnya diselesaikan oleh pengembang lain di proyek.

Dia melakukan beberapa hal tingkat rendah seperti bit switching untuk membuatnya bekerja jadi saya tidak terlalu yakin dengan solusi akhir yang sebenarnya

AndyOHart
sumber
Ini membantu saya memecahkan masalah saya: Saya harus mengarahkan kembali onRequestPermissionsResult dari fragmen induk ke fragmen anak (bersarang). Terima kasih atas tipnya!
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);
Shahab Rauf
sumber
6

Ini akan bekerja ..

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
Sumit khare
sumber
implementasi super menyebut implementasi fragmen bukan kerangka kerja hte
Mohammad Yahia
5

Jika Anda memanggil kode ini dari sebuah fragmen, ia memiliki metode requestPermissions sendiri.

Jadi konsep dasarnya adalah, Jika Anda berada dalam suatu Kegiatan, maka panggilan

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

dan jika dalam Fragmen, panggil saja

requestPermissions(permissionsList,
                            permissionscode);
PounKumar Purushothaman
sumber
1
Membutuhkan API level 23 ... Pada yang sebelumnya digunakan FragmentCompat.requestPermissions().
Minas Mina
5

Saya memiliki masalah yang sama kecuali saya menekan tombol untuk melakukan panggilan, yang memicu panggilanIntent. Saya memeriksa izin terlebih dahulu, jika tidak diberikan saya meminta izin dan padaRequestPermissionResult saya memanggil izin cek dan menelepon lagi.

 @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();
        }
    }
}
Ndheti
sumber
3

Berdasarkan jawaban goodgamerguy solusinya adalah:

myFragment.this.requestPermissions(....)
havabon
sumber
2

Sebelum Anda memeriksa semuanya sesuai dengan jawaban di atas, pastikan kode permintaan Anda tidak 0 !!!

periksa kode onRequestPermissionsResult () di 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);
        }
    }
}
Pedagang lilin
sumber
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();
    }
}
pengguna2002721
sumber
2

Saya punya solusi luar biasa untuk mencapai ini, buat BaseActivity seperti ini.

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

}

Sekarang Anda dapat memanggil kode untuk meminta izin seperti ini

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

Sekarang setiap kali ini terjadi di mana saja baik dalam fragmen Anda atau dalam aktivitas apa pun aktivitas dasar akan dipanggil.

Terima kasih

Abhishek Dubey
sumber
1

Anda bisa menggunakannya requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);. Jangan gunakan FragmentCompat jika Anda menggunakan v4.

Remario
sumber
Tolong jelaskan mengapa.
Placeable
1

Detail

  • Kotlin 1.2.70
  • diperiksa di minSdkVersion 19
  • Android studio 3.1.4

Algoritma

modul - kamera, lokasi, ....

  1. Periksa apakah hasSystemFeature (jika modul ada di telepon)
  2. Periksa apakah pengguna memiliki akses ke modul
  3. Kirim permintaan izin (minta pengguna untuk mengizinkan penggunaan modul )

fitur

  1. Bekerja dengan Aktivitas dan Fragmen
  2. Hanya memiliki satu respons hasil
  3. Dapat memeriksa beberapa modul dalam satu permintaan

Larutan

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

Penggunaan dalam Aktivitas (dalam fragmen yang sama)

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 -> {
//                }
//            }
        }
    }
}
Bodnarchuk dengan mudah
sumber
1

Di sini saya ingin menunjukkan kode saya bagaimana saya mengatur ini.

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

Di sini, di kelas ini saya ingin memeriksa izin yang diberikan atau tidak. Tidak maka saya akan meminta izin dari MainActivity saya seperti

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

Sekarang dalam metode onCreate Anda perlu memanggil fungsi requestForPermission ().

Itu saja. Anda juga dapat meminta beberapa izin sekaligus.

pavel
sumber
1

PEMBARUAN: melihat jawaban orang lain tentang menelepon super.onRequestPermissionResult()dalam Aktivitas dan yang memperbaiki masalah kode permintaan yang saya sebutkan dan menyebut fragmennya padaRequestPermissionResult.

abaikan hal ini:

Bagi saya itu adalah panggilan onRequestPermissionResultKegiatan meskipun saya meneleponfragment.requestPermission(...) , TAPI mengembalikan hasil dengan kode request yang salah (111 berubah menjadi 65647 mengapa ??? Saya tidak akan pernah tahu).

Untungnya ini adalah satu-satunya izin yang kami minta di layar itu, jadi saya abaikan saja kode permintaan (tidak punya waktu untuk mencari tahu mengapa itu tidak benar sekarang)

grgrssll
sumber
Tambahkan 65536 dan 111 dan Anda akan mendapatkannya. Ini karena topeng bit. Lihat beberapa topik.
CoolMind
0

Saya juga menemui masalah yang bahkan jika Anda memanggil requestPermissions yang benar, Anda masih dapat memiliki masalah ini. Masalahnya adalah bahwa aktivitas orang tua dapat menggantikan metode ini tanpa memanggil super. Tambahkan super dan itu akan diperbaiki.

VolodymyrH
sumber