एंड्रॉइड: java.lang.SecurityException: अनुमति अस्वीकार: इरादे शुरू करें


112

मैंने GWVectraNotifier गतिविधि युक्त एक एप्लिकेशन बनाया है जिसे अन्य अनुप्रयोगों से अधिसूचना प्रदर्शित करने के लिए कहा जाता है।

नोटिफिकेशन डायलॉग में 'शो' बटन और 'क्लोज' बटन होगा।

'शो' बटन पर क्लिक करने पर संबंधित गतिविधि शुरू हो जाएगी।

उपरोक्त एप्लिकेशन की कार्यक्षमता की जांच करने के लिए,

मैंने चेकव्यू ईवेंट ट्रिगर पर K9Mail एप्लिकेशन से GWVectraNotifier गतिविधि शुरू की।

मैं GWVectraNotifier गतिविधि को सफलतापूर्वक शुरू करने में सक्षम हूं, लेकिन 'शो' बटन पर क्लिक करने पर मुझे K9mail की 'मैसेजलिस्ट' गतिविधि शुरू करनी होगी। ऐसा करने के लिए, मैंने नीचे दिया गया कोड लिखा है:

Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i); 

जो फेंकता है:

WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675):     at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675):     at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2$1.run(GWVectraNotifier.java:63)
WARN/System.err(675):     at android.app.Activity.runOnUiThread(Activity.java:3707)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2.onClick(GWVectraNotifier.java:53)
WARN/System.err(675):     at android.view.View.performClick(View.java:2408)
WARN/System.err(675):     at android.view.View$PerformClick.run(View.java:8816)
WARN/System.err(675):     at android.os.Handler.handleCallback(Handler.java:587)
WARN/System.err(675):     at android.os.Handler.dispatchMessage(Handler.java:92)
WARN/System.err(675):     at android.os.Looper.loop(Looper.java:123)
WARN/System.err(675):     at android.app.ActivityThread.main(ActivityThread.java:4627)
WARN/System.err(675):     at java.lang.reflect.Method.invokeNative(Native Method)
WARN/System.err(675):     at java.lang.reflect.Method.invoke(Method.java:521)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
WARN/System.err(675):     at dalvik.system.NativeStart.main(Native Method)

वास्तव में मैं समझ नहीं पा रहा हूं कि k9Mail के MessageList तक पहुंचने के लिए मेरे नोटिफिकेशन एप्लिकेशन की मेनिफेस्ट फाइल में क्या अनुमति शामिल है। मैं k9mail एप्लिकेशन की मैनिफ़ेस्ट फ़ाइल में शामिल अनुमतियों के नीचे चिपका रहा हूँ:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"/>
<permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="dangerous"
            android:label="@string/read_attachment_label"
            android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"/>
<permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"
             android:permissionGroup="android.permission-group.MESSAGES"
             android:protectionLevel="dangerous"
             android:label="@string/remote_control_label"
             android:description="@string/remote_control_desc"/>
<uses-permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"/>
<permission android:name="com.fsck.k9.permission.READ_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/read_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"/>
<permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/delete_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"/>           

क्या कोई मुझे बता सकता है कि मेरे ऐप में कौन सी अनुमति शामिल है? उपरोक्त अनुमतियों में कुछ केवल k9mail के लिए हैं, क्योंकि वे k9 के लिए लिखे गए अनुमति वर्ग हैं। तो, मैं केवल ऊपर दी गई अनुमतियों में एंड्रॉइड की अंतर्निहित अनुमतियों को शामिल करने में सक्षम होगा। मैंने ऐसा करके भी कोशिश की, लेकिन इससे मेरी समस्या हल नहीं हुई :(


मैंने AndroidManifest.xml में MessageList गतिविधि टैग के तहत प्रकट फ़ाइल में निम्नलिखित आशय फ़िल्टर जोड़कर इसे हल किया: <इरादे-फ़िल्टर> <कार्रवाई Android: नाम = "android.intent.action.MAIN" /> </ आशय-फ़िल्टर >
स्वाती ईपी

मैंने दोनों को जोड़ा है <इरादे-फ़िल्टर> <कार्रवाई एंड्रॉइड: नाम = "android.intent.action.MAIN" /> </ इरादे-फ़िल्टर> और Android: निर्यात = "सही" लेकिन फिर भी मुझे java.lang.security मिल रहा है अपवाद? क्या आप इसे हल करने के लिए मेरी मदद कर सकते हैं ..
चरन पाइ

जवाबों:


155

android:exported="true"जिस गतिविधि को आप प्रारंभ करने का प्रयास कर रहे हैं, उसमें आपको प्रकट फ़ाइल में जोड़ना होगा ।

से निर्यात प्रलेखन: एंड्रॉयड :

android: निर्यात
की गई गतिविधि अन्य अनुप्रयोगों के घटकों द्वारा लॉन्च की जा सकती है या नहीं - "सत्य" यदि यह हो सकता है, और यदि नहीं तो "गलत"। यदि "गलत" है, तो गतिविधि को केवल एक ही उपयोगकर्ता आईडी के साथ एक ही एप्लिकेशन या एप्लिकेशन के घटकों द्वारा लॉन्च किया जा सकता है।

डिफ़ॉल्ट मान इस बात पर निर्भर करता है कि गतिविधि में इरादे फ़िल्टर शामिल हैं या नहीं। किसी भी फ़िल्टर की अनुपस्थिति का मतलब है कि गतिविधि को केवल उसके सटीक वर्ग के नाम को निर्दिष्ट करके ही लागू किया जा सकता है। इसका तात्पर्य यह है कि यह गतिविधि केवल अनुप्रयोग-आंतरिक उपयोग के लिए अभिप्रेत है (क्योंकि अन्य वर्ग का नाम नहीं जानते होंगे)। तो इस मामले में, डिफ़ॉल्ट मान "गलत" है। दूसरी ओर, कम से कम एक फिल्टर की उपस्थिति का मतलब है कि गतिविधि बाहरी उपयोग के लिए अभिप्रेत है, इसलिए डिफ़ॉल्ट मान "सही" है।

यह विशेषता अन्य अनुप्रयोगों के लिए किसी गतिविधि के जोखिम को सीमित करने का एकमात्र तरीका नहीं है। आप बाहरी संस्थाओं को सीमित करने के लिए अनुमति का उपयोग कर सकते हैं जो गतिविधि को लागू कर सकते हैं (अनुमति विशेषता देखें)।


2
मेरे लिए समस्या का आधा हिस्सा ठीक करें, यदि आप पहले निर्यात की गई सेवा के साथ एप्लिकेशन इंस्टॉल करने का प्रयास करते हैं, तो मुख्य एप्लिकेशन इंस्टॉल करें, आप सेवा को हटाने के लिए कभी भी सफल नहीं होंगे ... दूसरा तरीका ठीक काम करता है ... यह इसलिए है क्योंकि अनुमति आवश्यक नहीं है जब मुख्य ऐप इंस्टॉल करते समय मौजूद हो, लेकिन मुझे यह पता नहीं है कि बिना अनुमति के इसे कैसे हल किया जाए ...
Bibu

102

java.lang.SecurityExceptionआप देख रहे हैं इसलिए है क्योंकि आप एक ही गतिविधि की ओर इशारा करते दो प्रविष्टियों में प्रवेश कर सकते हैं। दूसरे को हटा दें और आपको जाने के लिए अच्छा होना चाहिए।

अधिक स्पष्टीकरण

आपको विभिन्न गुणों के साथ प्रकट में गतिविधि को 2 बार घोषित किया जा सकता है, जैसे:

 <activity android:name=".myclass"> </activity>

तथा

 <activity android:name=".myclass" android:label="@string/app_name"> 
     <intent-filter> 
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

आपको प्रकट से अवांछित को हटा देना चाहिए


2
आपको विभिन्न गुणों के साथ प्रकट में गतिविधि 2 बार घोषित की जा सकती है, जैसे: <गतिविधि android: name = "। myclass"> </ activity> और <गतिविधि android: name = "। myclass" android: label = "@ string / app_name "> <इरादे-फ़िल्टर> <कार्रवाई Android: नाम =" android.intent.action.MAIN "/> <श्रेणी Android: नाम =" android.intent.category.LAUNCHER "/> </ इरादे-फ़िल्टर": / गतिविधि>। आपको प्रकट से अवांछित को हटा देना चाहिए
जोमिया

1
महान जवाब jomia. लेकिन एक सवाल, एक समय में मेरे पास केवल एक लॉन्चर गतिविधि है। और समान कोड eumlaotr के साथ चलता है, लेकिन डिवाइस में यह सुरक्षा अपवाद दिखाता है। क्या आप कृपया विस्तार से बताएं।
टॉफिक अहमद

मुझे लगता है कि आपको ऐप को डिवाइस में अनइंस्टॉल करना होगा और इसे फिर से इंस्टॉल करना होगा। फिर यह काम करेगा
जोमिया

16

अपनी मेनिफेस्ट फ़ाइल में यह पहले लिखें </application >

<activity android:name="com.fsck.k9.activity.MessageList">
   <intent-filter>
      <action android:name="android.intent.action.MAIN">
      </action>
   </intent-filter>
</activity>

और मुझे बताएं कि क्या यह आपके मुद्दे को हल करता है :)


अच्छी तरह से लॉग को देखकर मुझे पूरा यकीन था कि इससे मदद मिलेगी। एक बात अपनी पूरी प्रकट फ़ाइल यहाँ पेस्ट करें
मुहम्मद शहाब

<प्रकट xmlns: android = " schemas.android.com/apk/res/android " पैकेज = "com.i10n.notifier" Android: versionCode = "1" Android: versionName = "1.0"> <उपयोग-अनुमति Android: नाम = "android.permission.RECEIVE_BOOT_COMPLETED" /> <उपयोग-अनुमति Android: नाम = "android.permission.READ_CONTACTS" /> <उपयोग-अनुमति Android: नाम = "android.permission.READ_SYNC_SETTINGS" /> <उपयोग-अनुमति Android: नाम = "android.permission.READ_OWNER_DATA" /> <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.ACCESS_NETWORK_STATE" />
स्वाति EP

<उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.INTERNET" /> <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.VIBRATE" /> <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.WAKER_LOCK" / > <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.WRITE_EXTERNAL_STORAGE" /> <एप्लीकेशन android: icon = "@ drawable / icon" android: label = "@ string / app_name" android = विषय = "@ android: style /" Theme.NoTitleBar "> <गतिविधि Android: नाम =" GWVectraNotifier "एंड्रॉयड: लेबल =" @ स्ट्रिंग / app_name "एंड्रॉयड: विषय =" @ एंड्रॉयड: शैली / Theme.Dialog ">।
स्वाति ईपी

<आशय-फ़िल्टर> <कार्रवाई Android: नाम = "android.intent.action.MAIN" /> <श्रेणी Android: नाम = "android.intent.category.LAUNCHER" /> </ आशय-फ़िल्टर> </ गतिविधि> < / आवेदन> </ प्रकट>
स्वाति ईपी

उपरोक्त 3 टिप्पणियों में, मैंने अपना नोटिफ़ायर एप्लिकेशन मैनिफ़ेस्ट फ़ाइल चिपकाया है। आपके जवाब के लिए धन्यवाद।
स्वाति ईपी

7

मुझे इस सटीक गतिविधि से यह समस्या थी।

आप एक बाहरी गतिविधि से com.fsck.k9.activity.MessageList शुरू नहीं कर सकते।

मैंने इसे हल किया:

Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9"); this.startActivity(LaunchK9);

Http://developer.android.com/reference/android/content/pm/PackageManager.html का उपयोग कर रहा है


6

मैं एक ही मुद्दे में चल रहा था और जैसा कि आपने वर्णित किया गया था, मैं आशय फिल्टर जोड़ने से बचना चाहता था। कुछ खुदाई के बाद, मुझे एक xml विशेषता वाला android मिला : निर्यात किया गया जिसे आपको उस गतिविधि में जोड़ना चाहिए जिसे आप कॉल करना चाहते हैं।

अगर आपकी गतिविधि में कोई इरादा फ़िल्टर नहीं जोड़ा गया है, तो यह डिफ़ॉल्ट रूप से गलत पर सेट है, लेकिन यदि आपके पास कोई इरादा फ़िल्टर है तो यह सही पर सेट हो जाता है।

यहाँ प्रलेखन http://developer.android.com/guide/topics/manifest/activity-element.html#exported है

tl; dr: android:exported="true"अपनी AndroidManifest.xml फ़ाइल में अपनी गतिविधि में जोड़ें और आशय-फ़िल्टर जोड़ने से बचें :)


1

सुनिश्चित करें कि घटक में "निर्यात" ध्वज सेट करने के लिए सही है। साथ ही अनुमति को परिभाषित करने वाले घटक का उपयोग करने वाले घटक से पहले स्थापित किया जाना चाहिए।


इसके अलावा, आपको यह सुनिश्चित करना होगा कि आपके पास सिस्टम स्तर के लक्जरी का आनंद लेने के लिए आपके पास सिस्टम / निजी-एप्लिकेशन विभाजन में ऐप है। किटकैट के बाद के उपकरणों में यह आवश्यक है
नरेन

1

यह आसान है शायद आपके पास कॉन्फ़िगरेशन में त्रुटि हो।

उदाहरण के लिए: Manifest.xml

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

लेकिन मेरे विन्यास में डिफ़ॉल्ट गतिविधि के लिए है

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

आपको इस कॉन्फ़िगरेशन और फ़ाइल Manifest.xml की जाँच करने की आवश्यकता है

शुभ लाभ


1

मैंने target sdk19 अपवादों के बाद से किटकैट संस्करण को बदलकर इस अपवाद को हल कियाAndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

BTW, इस समय ग्रेडल इस बात का ध्यान रखता है, और एंड्रॉइड डेवलपर्स प्रकट फ़ाइल में एसडीके संस्करण निर्दिष्ट नहीं करते हैं
kiedysktos

1
एक भयानक समाधान है। कभी भी नीचे की ओर निशाना न लगाएं।
जेरेड बुरो

यह काम करेगा लेकिन एक उच्च संभावना है कि यह हल होने की तुलना में अधिक समस्याएं पैदा करेगा। मेरी राय है
एवर ओज़टर्क

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