Android: java.lang.SecurityException: İzin Reddi: Amacı Başlat


112

Diğer uygulamalardan Bildirimi görüntülemek için çağrılan GWVectraNotifier etkinliğini içeren bir uygulama oluşturdum.

Bildirim iletişim kutusunda, 'göster' düğmesi ve 'kapat' düğmesi olacaktır.

'Göster' düğmesine tıklandığında, ilgili aktivite başlatılacaktır.

Yukarıdaki uygulamanın işlevselliğini kontrol etmek için,

Checkmail olay tetikleyicisinde K9Mail uygulamasından GWVectraNotifier etkinliğini başlattım.

GWVectraNotifier etkinliğini başarıyla başlatabiliyorum, ancak 'göster' düğmesine tıkladığınızda K9mail'in 'MessageList' etkinliğini başlatmam gerekecek.Bunu yapmak için aşağıdaki kodu yazdım:

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

hangi atar:

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)

Aslında, k9Mail'in MessageList'ine erişmek için Notifier uygulamamın bildirim dosyasına hangi izinleri dahil edeceğimi anlayamıyorum. K9mail uygulamasının manifest dosyasında bulunan izinlerin altına yapıştırıyorum:

<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"/>           

Biri bana uygulamama hangi izni dahil edeceğimi söyleyebilir mi? Yukarıdaki izinlerde bazıları yalnızca k9mail içindir, çünkü bunlar k9 için yazılmış izin sınıflarıdır. Bu yüzden, yukarıda verilen izinlere sadece android'in yerleşik izinlerini dahil edebileceğim. Ben de denedim ama sorunumu çözmedi :(


AndroidManifest.xml'deki MessageList Activity etiketinin altındaki manifest dosyasına aşağıdaki amaç filtresini ekleyerek bu sorunu çözdüm: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP

hem <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> ve android: exported = "true" ekledim ama yine de java.lang.security alıyorum istisna? Lütfen bunu çözmeme yardım eder misin ..
Charan Pai

Yanıtlar:


155

android:exported="true"Başlatmaya çalıştığınız aktiviteye manifest dosyasını eklemelisiniz .

Gönderen ihraç belgeler: android :

android: exported
Aktivitenin diğer uygulamaların bileşenleri tarafından başlatılıp başlatılamayacağı - mümkünse "true", değilse "false". "Yanlış" ise, etkinlik yalnızca aynı uygulamanın bileşenleri veya aynı kullanıcı kimliğine sahip uygulamalar tarafından başlatılabilir.

Varsayılan değer, etkinliğin amaç filtreleri içerip içermediğine bağlıdır. Herhangi bir filtrenin olmaması, etkinliğin yalnızca tam sınıf adı belirtilerek çağrılabileceği anlamına gelir. Bu, etkinliğin yalnızca uygulama içi kullanım için tasarlandığı anlamına gelir (çünkü diğerleri sınıf adını bilmeyecektir). Dolayısıyla bu durumda, varsayılan değer "yanlış" tır. Öte yandan, en az bir filtrenin varlığı, etkinliğin harici kullanım için tasarlandığını gösterir, bu nedenle varsayılan değer "true" dur.

Bu özellik, bir faaliyetin diğer uygulamalara maruz kalmasını sınırlamanın tek yolu değildir. Etkinliği başlatabilecek harici varlıkları sınırlamak için de bir izin kullanabilirsiniz (izin özniteliğine bakın).


2
Benim için sorunun yarısını düzeltin, önce dışa aktarılan hizmetle uygulamayı yüklemeye çalışırsanız, sonra ana uygulamayı yüklerseniz, hizmeti kaldırmaya asla ulaşamazsınız ... Yine de diğer yol iyi çalışır ... Bunun nedeni Ana uygulamayı yüklerken gerekli izin mevcut değil, ancak izinleri kaldırmadan nasıl çözeceğimi bilmiyorum ...
Bibu

102

java.lang.SecurityExceptionAynı etkinliğe işaret eden iki giriş girebilir çünkü görüyoruz olduğunu. İkincisini çıkarın ve gitmekte fayda var.

Daha Fazla Açıklama

Aşağıdaki gibi farklı özelliklerle manifestte 2 kez etkinlik ilan edilebilirsiniz:

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

ve

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

Manifestten istenmeyen olanı kaldırmalısınız


2
<activity android: name = ". myclass"> </activity> ve <activity android: name = ". myclass" android: label = "@ string gibi farklı özelliklerle manifestte 2 kez etkinlik ilan edilebilirsin / app_name "> <intent-filter> <action android: name =" android.intent.action.MAIN "/> <category android: name =" android.intent.category.LAUNCHER "/> </intent-filter> < / activity>. istenmeyen olanı manifestten kaldırmalısınız
Jomia

1
Harika cevap jomia.Ama bir soru, her seferinde sadece bir başlatıcı etkinliğim var ve aynı kod eumlaotr ile çalışıyor ancak cihazda güvenlik istisnası gösteriyor, lütfen detaylandırabilir misiniz?
Tofeeq Ahmad

Sanırım uygulamayı cihazdan kaldırıp yeniden yüklemeniz gerekiyor. O zaman işe yarayacak
Jomia

16

Manifest dosyanıza bunu daha önce yazın </application >

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

ve sorununuzu çözerse bana söyleyin :)


günlüklere bakarak yardımcı olacağından oldukça emindim. Bir şey yapın, manifest dosyanızı eksiksiz buraya yapıştırın
Muhammad Shahab

<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <kullanım izni android: ad = "android.permission.RECEIVE_BOOT_COMPLETED" /> <kullanım-izni android: name = "android.permission.READ_CONTACTS" /> <kullanım-izni android: name = "android.permission.READ_SYNC_SETTINGS" /> <kullanım izni android: name = "android.permission.READ_OWNER_DATA" /> <uses-allow android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP

<uses-allow android: name = "android.permission.INTERNET" /> <uses-allow android: name = "android.permission.VIBRATE" /> <uses-allow android: name = "android.permission.WAKE_LOCK" / > <uses-allow android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <uygulama android: icon = "@ drawable / icon" android: label = "@ string / app_name" android: theme = "@ android: style / Theme.NoTitleBar "> <activity android: name =". GWVectraNotifier "android: label =" @ string / app_name "android: theme =" @ android: style / Theme.Dialog ">
Swathi EP

<intent-filter> <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> < / application> </manifest>
Swathi EP

Yukarıdaki 3 yorumda, Notifier uygulama manifest dosyamı yapıştırdım. Cevabın için teşekkürler.
Swathi EP


6

Aynı sorunla karşılaşıyordum ve açıkladığınız gibi amaç filtresini eklemekten kaçınmak istedim. Biraz kazı yaptıktan sonra, çağrılmak istediğiniz aktiviteye eklemeniz gereken bir xml niteliği android: dışa aktarıldı .

Etkinliğinize hiçbir amaç filtresi eklenmemişse varsayılan olarak false değerine ayarlanır, ancak bir amaç filtreniz varsa, true olarak ayarlanır.

belgeler http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: android:exported="true"AndroidManifest.xml dosyanızdaki etkinliğinizi ekleyin ve amaç filtresini eklemekten kaçının :)


1

Bileşenin "dışa aktarıldı" bayrağının true olarak ayarlandığından emin olun. Ayrıca izni tanımlayan bileşen, onu kullanan bileşenden önce kurulmalıdır.


Ayrıca, Sistem düzeyinde lüksün keyfini çıkarmak için uygulamanızı sistem / özel uygulama bölümünde bulundurduğunuzdan emin olmalısınız. Bu, KitKat ileriye dönük cihazlarda gereklidir
Naren

1

Kolay, belki konfigürasyonda hata var.

Örneğin: Manifest.xml

görüntü açıklamasını buraya girin

Ancak yapılandırmamda varsayılan Activity .Splash var.

görüntü açıklamasını buraya girin

bu yapılandırmayı ve Manifest.xml dosyasını kontrol etmeniz gerekiyor

İyi şanslar


1

Bu istisnayı target sdk, 19'dan sonraki kitkat sürümünden değiştirerek çözdümAndroidManifest.xml.

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

BTW, şu anda Gradle bununla ilgileniyor ve Android geliştiricileri manifest dosyasında sdk sürümünü belirtmiyor
kiedysktos

1
Korkunç bir çözüm var. Asla aşağı doğru hedeflemeyin.
Jared Burrows

Bu işe yarayacak, ancak çözdüğünden daha fazla soruna neden olma ihtimali yüksek. Benim fikrim bu
Evren Öztürk

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.