Android Marshmallow'da belirli bir uygulama için İzin Ekranını programlı olarak nasıl açabilirim?


330

Yeni Android Marshmallow sürümüyle ilgili bir sorum var:

Belirli bir uygulamanın İzin Ekranını Niyet veya benzeri bir şeyle görüntülemek mümkün müdür?

Android M İzin Ekranı

Uygulama ayarlarını aşağıdaki kodla görüntülemek mümkündür - İzin Ekranını doğrudan açmak için analog bir çözüm var mı?

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

Bu konuda zaten biraz araştırma yaptım ama uygun bir çözüm bulamadım - her yardımı takdir ediyorum!



Yanıtlar:


443

Resmi Marshmallow izinleri videosuna göre ( 4m 43s işaretinde ), bunun yerine uygulama Ayarları sayfasını açmanız gerekir (oradan İzinler sayfasına tek bir tıklama yapılır).

Ayarlar sayfasını açmak için

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

12
Uygulama ekranının genel ayrıntılarına yönlendiriliyor. Özellikle Uygulama İzinleri ekranına nasıl gidebilirim? Ben de tek bir tıklama kalmasını istemiyorum,
Milind Mevada

5
@MilindMevada - bunu şu anda yapamazsınız.
Martin Konecny

ayarlar etkinliğinden "gerçek zamanlı" olarak niyetleri kullanarak etkinliğinize veri gönderebilir misiniz? karşılaştığım sorun , ayarlardan gönderildikten sonra bu verileri etkinliğinizde işlemek .
ThunderWiring

Bu, uygulamada hata ayıklarken çalışır, ancak APK'yı imzaladıktan sonra gerçek bir neden olmadan kilitlenir. Logcat'te de hiçbir şey belli değil.
1919

181

Bu mümkün değil. Ben de yapmaya çalıştım. Paket adını ve başlatılacak aktiviteyi bulabilirdim. Ancak sonunda, bildiremeyeceğiniz eksik bir izin nedeniyle bir güvenlik istisnası alacaksınız.

GÜNCELLEME:

Diğer cevapla ilgili olarak, Uygulama ayarları ekranını açmanızı da öneririm. Bunu aşağıdaki kodla yaparım:

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

Bunu geçmiş yığınımda istemediğim için niyet bayraklarını kullanarak kaldırıyorum.


Ben de aynı şeyi yaşadım ve bunun için bir çözüm / başka bir çözüm olabileceğini düşündüm ...: - /
Frederik Schweiger

Hayır, ne yazık ki tasarımla mümkün değil. Daha fazla bilgi için Google + 'da bu tartışmaya göz atın
Frederik Schweiger

1
@Mulgard Whatsapp targetSdk = "23" kullanıyor olmalıdır. Bu, uygulamanın kullanıcıdan izni etkinleştirmesini istemesini sağlar. Hedef SDK değeriniz <23 ise, kullanıcıya uygulama izinleri ekranını gösterebilmek yararlı olsa da, yalnızca genel uygulama ayarları ekranını gösterebileceğimiz anlaşılıyor.
vman

4
Intent.FLAG_ACTIVITY_NO_HISTORY, ayarlar ekranında bir açılır pencere görüntülendiğinde tabletlerde bazen sorunlu bir duruma neden olabilir, ayarlar ekranını kapatır. Sadece bu bayrağı kaldırmak bu sorunu çözecektir.
Wirling

2
Aynı zamanda kullanıcıya "İzin" e girmesini bildiren bir Tost gösterebilirsiniz (uygulamanızın geri kalanı kullanıcının dilinde mevcut olmasa bile bu mesajı yerelleştirmek iyi bir fikirdir)
18'de 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);

Açıklama Uygulama için Ayrıntılar ayar sayfasını açar. Buradan kullanıcı istenen izni manuel olarak atamak zorundadır.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   İsteğe bağlı . Ayarlandıysa, yeni ekran olarak Ayarlar Ekranını (Etkinlik) açar. Aksi takdirde, şu anda çalışan etkinlikte açılacaktır.

Uri.fromParts("package", getPackageName(), null)
   URI hazırlar veya oluşturur, getPackageName () - uygulama paketinizin adını döndürür.

intent.setData(uri)
   Bunu ayarlamayı unutmayın . Aksi takdirde, alacaksınız android.content.ActivityNotFoundException . Çünkü niyetinizi belirlediniz Settings.ACTION_APPLICATION_DETAILS_SETTINGS ve android arama yapmak için bir isim bekliyor.


Kelimenin tam anlamıyla en çok oy alan cevap budur. Neden bunu çoğaltın ve orijinal cevabı uzatmıyorsunuz ?!
Thomas Keller

1
Ayrıntılı açıklama için teşekkür ederim.
David Refoua

34

Bunun yerine, belirli bir uygulamanın genel ayarlarını bir satırla açabilirsiniz

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

Yapınızın nasıl yapılandırıldığına bağlı olarak paket adını almak için getActivity (). GetPackageName () yöntemini kullanmak isteyebilirsiniz.
Cory Roy

15

İzin ekranını programlı olarak açmak mümkün değildir. Bunun yerine, uygulama ayarları ekranını açabiliriz.

kod

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

Örnek Çıktı

resim açıklamasını buraya girin


1
İzin sayfasını istiyor
Maveň ツ

10

İçine daha az kod yazmak Kotlinistiyorsanız bunu yapabilirsiniz:

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

Dayanarak Martin Konecny cevap


Kotin uzantılarının güzel kullanımı
David Jarvis

7

Kotlin tarzı.

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

5

Belki bu size yardımcı olur

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

3

SADECE FLYME OS (Meizu) hakkında konuşuyorsak , izinlere sahip kendi Güvenlik uygulaması var.

Açmak için aşağıdaki amacı kullanın:

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

Nedeni BuildConfig , uygulamanızın BuildConfig dosyasıdır .


3

Xamarin Formlar Android:

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

0

pragmatik olarak izin almak mümkün değildir ... ama kötü bir şekilde uygulamanızı maalesef durduran {} catch {} kodunu denemenizi öneririz ... ve catch body'de gezinecek bir iletişim kutusu kullanıcı diğer uygulamalar üzerinde çizmek izni etkinleştirmek için küçük bir öğretici ... sonra evet düğmesini tıklayın bu kodu koymak ...

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

bu niyet doğrudan izinleri yönetmek için diğer uygulamalar üzerinde beraberlik listesini açmaktır ve daha sonra buradan diğer uygulamalar üzerinde beraberlik için tek bir tıklama İzinler ... biliyorum bu aradığınız cevap değil ... ama Bunu uygulamalarımda yapıyorum ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.