एंड्रॉइड मार्शमैलो पर विशिष्ट एप्लिकेशन के लिए अनुमति स्क्रीन को प्रोग्रामेटिक रूप से कैसे खोलें?


330

मेरे पास नए Android मार्शमैलो रिलीज़ के बारे में एक प्रश्न है:

क्या किसी विशिष्ट ऐप के लिए अनुमति स्क्रीन को कुछ इसी तरह या किसी अन्य चीज़ के माध्यम से प्रदर्शित करना संभव है?

Android M अनुमति स्क्रीन

निम्नलिखित कोड के साथ ऐप सेटिंग्स को प्रदर्शित करना संभव है - क्या अनुमति स्क्रीन को सीधे खोलने के लिए एक एनालॉग समाधान है?

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

मैंने पहले से ही इस पर कुछ शोध किया था, लेकिन मैं एक उचित समाधान खोजने में सक्षम नहीं था - मैं हर मदद की सराहना करूंगा!


यह कोशिश करो यह काम हो सकता है stackoverflow.com/a/41221852/5488468
Bipin Bharti

जवाबों:


443

आधिकारिक मार्शमैलो परमिशन वीडियो ( 4 मी 43 के दशक के निशान पर ) के अनुसार, आपको इसके बजाय एप्लिकेशन सेटिंग्स पेज को खोलना होगा (वहां से यह अनुमतियों के पेज पर एक क्लिक है)।

सेटिंग पेज खोलने के लिए, आप करेंगे

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

12
यह एप्लिकेशन स्क्रीन के सामान्य विवरण पर पुनर्निर्देशित कर रहा है। विशेष रूप से ऐप अनुमतियां स्क्रीन पर कैसे जा सकते हैं। मैं नहीं चाहता कि शेष एक क्लिक भी,
मिलिंद मेवाड़ा

5
@MilindMevada - फिलहाल आप ऐसा नहीं कर सकते।
मार्टिन कोन्सेनी

क्या आप "रियलटाइम" में इंटेंट का उपयोग करके सेटिंग गतिविधि से अपनी गतिविधि के लिए डेटा भेज सकते हैं? एक बार सेटिंग्स से भेजे जाने के बाद समस्या का सामना करने वाला इम आपकी गतिविधि में इस डेटा को संभाल रहा है ।
थंडरवर्ल्ड

यह ऐप को डीबग करते समय काम करता है, लेकिन एपीके पर हस्ताक्षर करने के बाद कोई वास्तविक कारण नहीं है। Logcat में कुछ भी स्पष्ट नहीं है।
JCutting8

181

यह नहीं हो सकता। मैंने भी ऐसा करने की कोशिश की। मैं पैकेज के नाम और गतिविधि का पता लगा सकता हूं जिसे शुरू किया जाएगा। लेकिन अंत में आपको एक सुरक्षा अनुमति मिल जाएगी क्योंकि एक लापता अनुमति के कारण आप घोषणा नहीं कर सकते।

अपडेट करें:

अन्य उत्तर के बारे में मैं भी ऐप सेटिंग्स स्क्रीन खोलने की सलाह देता हूं। मैं निम्नलिखित कोड के साथ ऐसा करता हूं:

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

जैसा कि मैं अपने इतिहास स्टैक में यह नहीं करना चाहता, मैं इसे इरादे झंडे का उपयोग करके हटा देता हूं।


मैंने उसी का अनुभव किया और सोचा कि इसके लिए एक समाधान / एक और उपाय हो सकता है ...: - /
फ्रेडरिक श्वेइगर

नहींं, दुर्भाग्य से इसकी डिजाइन द्वारा संभव नहीं है। अधिक जानकारी के लिए Google+ पर इस चर्चा की जाँच करें: goo.gl/Wqjjff
फ्रेडरिक

1
@Mulgard व्हाट्सएप को targetSdk = "23" का उपयोग करना चाहिए। यह एप्लिकेशन को अनुमति देने के लिए उपयोगकर्ता को संकेत देने की अनुमति देता है। यदि आपका लक्ष्य SDK <23 है, तो उपयोगकर्ता को एप्लिकेशन अनुमतियां स्क्रीन दिखाने में सक्षम होना उपयोगी है, हालांकि ऐसा लगता है कि हम केवल सामान्य सेटिंग स्क्रीन दिखा सकते हैं।
वमन

4
Intent.FLAG_ACTIVITY_NO_HISTORY कभी-कभी गोलियों पर एक समस्यापूर्ण स्थिति पैदा कर सकता है जब सेटिंग्स स्क्रीन के भीतर एक पॉप-अप दिखाया जाता है तो यह सेटिंग्स स्क्रीन को बंद कर देगा। बस उस झंडे को हटाने से इस समस्या का समाधान हो जाएगा।
विलिंग

2
आप उसी समय एक टोस्ट दिखा सकते हैं जब उपयोगकर्ता "अनुमति" में जाने का निर्देश दे (इस संदेश को स्थानीय बनाने के लिए अच्छा विचार है, भले ही आपका बाकी ऐप उपयोगकर्ता की भाषा में उपलब्ध न हो)
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);

विवरण एप्लिकेशन के लिए विवरण सेटिंग पृष्ठ खोलता है। यहां से उपयोगकर्ता को मैन्युअल रूप से वांछित अनुमति देनी होगी।

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   वैकल्पिक । यदि सेट किया जाता है तो नई गतिविधि के रूप में सेटिंग्स स्क्रीन (गतिविधि) को खोलता है। अन्यथा, यह वर्तमान में चल रही गतिविधि में खोला जाएगा।

Uri.fromParts("package", getPackageName(), null)
   URI तैयार करता है या बनाता है, जबकि, getPackageName () - आपके एप्लिकेशन पैकेज का नाम लौटाता है।

intent.setData(uri)
   इसे सेट करना न भूलें । नहीं तो मिलेगा android.content.ActivityNotFoundExceptionक्योंकि आपने अपना इरादा निर्धारित कर लिया है Settings.ACTION_APPLICATION_DETAILS_SETTINGS और Android को उम्मीद है कि कुछ नाम खोज लिए जाएंगे।


यह वस्तुतः शीर्ष मतदान का उत्तर है। क्यों इस डुप्लिकेट और मूल जवाब का विस्तार नहीं ?!
थॉमस केलर

1
गहराई से स्पष्टीकरण के लिए धन्यवाद।
डेविड रिफौआ

34

इसके बजाय, आप एक लाइन के साथ विशेष ऐप की सामान्य सेटिंग्स खोल सकते हैं

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

आप getActivity ()। GetPackageName () का उपयोग पैकेज के नाम को प्राप्त करने के लिए कर सकते हैं जो आपके बिल्ड को कॉन्फ़िगर करने के तरीके पर निर्भर करता है।
कोरी रॉय

15

अनुमति स्क्रीन को प्रोग्रामेटिक रूप से खोलना संभव नहीं है। इसके बजाय, हम ऐप सेटिंग स्क्रीन खोल सकते हैं।

कोड

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

नमूना आउटपुट

यहां छवि विवरण दर्ज करें


1
वह परमिशन पेज के लिए पूछ रहा है
Maveň '

10

यदि आप कम कोड लिखना चाहते Kotlinहैं तो आप ऐसा कर सकते हैं:

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

मार्टिन Konecny जवाब के आधार पर


कोटिन एक्सटेंशन का अच्छा उपयोग
डेविड जार्विस

7

कोटलिन शैली।

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

5

हो सकता है यह आपकी मदद करेगा

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

अगर हम FLYME OS (Meizu) के बारे में बात कर रहे हैं, तो केवल अनुमतियों के साथ इसका अपना सुरक्षा ऐप है।

इसे खोलने के लिए निम्नलिखित इरादे का उपयोग करें:

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

बिल्ड -कारण BuildConfig आपके ऐप का BuildConfig है


3

ज़ामरीन फॉर्म एंड्रॉइड:

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

0

व्यावहारिक रूप से अनुमति प्राप्त करना संभव नहीं है ... लेकिन बीमार आपको सुझाव देता है कि कोड की उस लाइन को {} कैच {} कैच में डालें, जो आपके ऐप को दुर्भाग्य से बंद कर दे ... और कैच बॉडी में एक डायलॉग बॉक्स बनाते हैं जो नेविगेट करेगा छोटे ट्यूटोरियल के लिए उपयोगकर्ता अन्य एप्लिकेशन की अनुमति पर ड्रॉ को सक्षम करने के लिए ... फिर हां बटन पर क्लिक करें यह कोड डालें ...

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

यह आशय अनुमतियों को प्रबंधित करने के लिए अन्य ऐप्स पर ड्रा की सूची को सीधे खोलना है और फिर यहाँ से यह अन्य ऐप पर ड्रा के लिए एक क्लिक है अनुमतियाँ ... मुझे पता है कि यह वह उत्तर नहीं है जिसकी आप तलाश कर रहे हैं ... लेकिन Im मेरे क्षुधा में यह कर ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.