Bagaimana secara terprogram membuka Layar Izin untuk aplikasi tertentu di Android Marshmallow?

330

Saya punya pertanyaan tentang rilis Android Marshmallow baru:

Apakah mungkin untuk menampilkan Layar Izin untuk aplikasi tertentu melalui Intent atau yang serupa?

Layar Izin M Android

Mungkin untuk menampilkan pengaturan aplikasi dengan kode berikut - apakah ada solusi analog untuk langsung membuka Layar Izin?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));

Saya sudah melakukan riset tentang hal ini tetapi saya tidak dapat menemukan solusi yang tepat - saya akan menghargai setiap bantuan!

Frederik Schweiger
sumber
Coba ini mungkin berhasil stackoverflow.com/a/41221852/5488468
Bipin Bharti

Jawaban:

443

Menurut video resmi izin Marshmallow (pada tanda 4m 43s ), Anda harus membuka halaman Pengaturan aplikasi (dari sana itu adalah satu klik ke halaman Izin).

Untuk membuka halaman pengaturan, Anda harus melakukannya

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Martin Konecny
sumber
12
Ini mengarahkan ke rincian umum layar Aplikasi. Bagaimana bisa masuk ke layar khusus Izin Aplikasi. Saya tidak ingin yang tersisa satu klik juga,
Milind Mevada
5
@MilindMevada - Anda tidak dapat melakukan itu saat ini.
Martin Konecny
bisakah Anda mengirim data dari aktivitas pengaturan ke aktivitas Anda menggunakan maksud, dalam "waktu nyata"? masalah yang saya hadapi adalah menangani data ini di aktivitas Anda setelah dikirim dari pengaturan.
ThunderWiring
Ini berfungsi saat men-debug aplikasi, tetapi macet tanpa alasan nyata setelah menandatangani APK. Tidak ada yang jelas di logcat juga.
JCutting8
181

Ini tidak mungkin. Saya mencoba melakukannya juga. Saya bisa mengetahui nama paket dan aktivitas yang akan dimulai. Tetapi pada akhirnya Anda akan mendapatkan pengecualian keamanan karena izin yang hilang Anda tidak dapat mendeklarasikan.

MEMPERBARUI:

Mengenai jawaban lain saya juga merekomendasikan untuk membuka layar Pengaturan aplikasi. Saya melakukan ini dengan kode berikut:

    public static void startInstalledAppDetailsActivity(final Activity context) {
    if (context == null) {
        return;
    }
    final Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + context.getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    context.startActivity(i);
}

Karena saya tidak ingin memiliki ini di tumpukan riwayat saya, saya menghapusnya menggunakan bendera maksud.

Thomas R.
sumber
Saya mengalami hal yang sama dan berpikir mungkin ada solusi / solusi lain untuk ini ...: - /
Frederik Schweiger
Tidak, sayangnya desainnya tidak memungkinkan. Untuk informasi lebih lanjut, lihat diskusi ini di Google+: goo.gl/Wqjjff
Frederik Schweiger
1
@Mulgard Whatsapp harus menggunakan targetSdk = "23". Ini memungkinkan aplikasi untuk meminta pengguna mengaktifkan izin. Jika SDK target Anda <23, dapat menunjukkan kepada pengguna layar izin aplikasi berguna, namun sepertinya kami hanya dapat menampilkan layar pengaturan aplikasi umum.
vman
4
Intent.FLAG_ACTIVITY_NO_HISTORY kadang-kadang dapat menyebabkan masalah pada tablet ketika pop-up ditampilkan di layar pengaturan, ia akan menutup layar pengaturan. Hanya menghapus bendera itu akan menyelesaikan masalah ini.
Wirling
2
Anda dapat menunjukkan Toast pada saat yang sama menginstruksikan pengguna untuk masuk ke "Izin" (ide yang bagus untuk melokalisasi pesan ini bahkan jika sisa aplikasi Anda tidak tersedia dalam bahasa pengguna)
vgergo
81
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

Deskripsi Membuka halaman pengaturan Detail untuk Aplikasi. Dari sini pengguna harus secara manual memberikan izin yang diinginkan.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Opsional . Jika diatur maka buka Layar Pengaturan (Aktivitas) sebagai aktivitas baru. Kalau tidak, itu akan dibuka dalam aktivitas yang sedang berjalan.

Uri.fromParts("package", getPackageName(), null)
   Mempersiapkan atau membuat URI, sebaliknya, getPackageName () - mengembalikan nama paket aplikasi Anda.

intent.setData(uri)
   Jangan lupa atur ini . Kalau tidak, Anda akan mendapatkannya android.content.ActivityNotFoundException . Karena Anda telah menetapkan niat Anda Settings.ACTION_APPLICATION_DETAILS_SETTINGS dan Android mengharapkan beberapa nama untuk dicari.

singhpradeep
sumber
Ini benar-benar apa jawaban terpilih adalah. Mengapa menduplikasi ini dan tidak memperluas jawaban asli ?!
Thomas Keller
1
Terima kasih atas penjelasannya yang mendalam.
David Refoua
34

Sebagai gantinya, Anda dapat membuka pengaturan umum aplikasi tertentu dengan satu baris

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
dgngulcan
sumber
Anda mungkin ingin menggunakan getActivity (). GetPackageName () untuk mendapatkan nama paket tergantung pada bagaimana build Anda dikonfigurasikan.
Cory Roy
15

Tidak mungkin membuka layar izin secara terprogram. Sebagai gantinya, kita dapat membuka layar pengaturan aplikasi.

Kode

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

Output Sampel

masukkan deskripsi gambar di sini

Vignes
sumber
1
Ia meminta izin halaman
Maveň ツ
10

Jika Anda ingin menulis lebih sedikit kode, KotlinAnda dapat melakukan ini:

fun Context.openAppSystemSettings() {
    startActivity(Intent().apply {
        action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
        data = Uri.fromParts("package", packageName, null)
    })
}

Berdasarkan jawaban Martin Konecny

Ultimo_m
sumber
penggunaan ekstensi Kotin yang bagus
David Jarvis
8

Gaya Kotlin.

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })
Sai
sumber
5

Mungkin ini akan membantu Anda

private void openSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivityForResult(intent, 101);
}
Sandeep Kumar
sumber
3

Jika kita berbicara tentang FLYME OS (Meizu) ONLY ada aplikasi Keamanan sendiri dengan izin.

Untuk membukanya gunakan niat berikut:

public static void openFlymeSecurityApp(Activity context) {
    Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    try {
        context.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Dari penyebab BuildConfig adalah aplikasi Anda BuildConfig .

Daniel
sumber
3

Xamarin Membentuk Android:

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
    var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
        Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
    Forms.Context.StartActivity(intent);
}
Nick Kovalsky
sumber
0

tidak mungkin mendapatkan izin secara pragmatis ... tetapi Anda tidak disarankan untuk meletakkan baris kode itu di coba {} catch {} yang membuat aplikasi Anda sayangnya berhenti ... dan di badan tangkapan buatlah kotak dialog yang akan menavigasi pengguna ke tutorial kecil untuk mengaktifkan undian atas izin aplikasi lain ... lalu klik tombol ya, masukkan kode ini ...

 Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(callSettingIntent);

maksud ini adalah untuk langsung membuka daftar undian dari aplikasi lain untuk mengelola izin dan kemudian dari sini itu adalah satu klik untuk undian dari aplikasi lain Izin ... saya tahu ini bukan jawaban yang Anda cari ... tapi Saya melakukan ini di aplikasi saya ...

Ashish
sumber