Android: java.lang.SecurityException: Permission Denial: start Intent

112

Saya telah membuat aplikasi yang berisi aktivitas GWVectraNotifier yang dipanggil dari aplikasi lain untuk menampilkan Notifikasi.

Pada dialog Notification, akan ada tombol 'show' dan 'close'.

Dengan mengklik tombol 'tampilkan', aktivitas terkait akan dimulai.

Untuk memeriksa fungsionalitas aplikasi di atas,

Saya memulai aktivitas GWVectraNotifier dari aplikasi K9Mail pada pemicu peristiwa checkmail.

Saya dapat memulai aktivitas GWVectraNotifier dengan sukses, tetapi dengan mengklik tombol 'show' saya harus memulai aktivitas 'MessageList' dari K9mail. Untuk melakukannya, saya menulis kode di bawah ini:

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

yang melempar:

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)

Sebenarnya saya tidak dapat memahami izin apa yang harus disertakan dalam file manifes aplikasi Pemberitahu saya untuk mengakses Daftar Pesan k9Mail. Saya menempel di bawah izin yang disertakan dalam file manifes aplikasi 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"/>           

Bisakah seseorang memberi tahu saya izin mana yang harus disertakan dalam aplikasi saya? Pada hak akses di atas, beberapa hanya untuk k9mail, karena itu adalah kelas izin yang ditulis untuk k9. Jadi, saya hanya akan dapat memasukkan izin bawaan android di izin yang diberikan di atas. Saya mencoba melakukannya juga, tetapi tidak menyelesaikan masalah saya :(

Swathi EP
sumber
Saya menyelesaikan ini dengan menambahkan filter maksud berikut dalam file manifes di bawah tag Aktivitas MessageList di AndroidManifest.xml: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP
saya telah menambahkan <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> dan android: Export = "true" tetapi saya masih mendapatkan java.lang.security pengecualian? dapatkah Anda membantu saya untuk menyelesaikan ini ..
Charan Pai

Jawaban:

155

Anda harus menambahkan android:exported="true" file manifes dalam aktivitas yang Anda coba mulai.

Dari android: dokumentasi yang diekspor :

android: diekspor
Apakah aktivitas bisa diluncurkan oleh komponen aplikasi lain atau tidak - "true" jika bisa, dan "false" jika tidak. Jika "salah", aktivitas hanya dapat diluncurkan oleh komponen aplikasi yang sama atau aplikasi dengan ID pengguna yang sama.

Nilai default bergantung pada apakah aktivitas berisi filter maksud. Tidak adanya filter berarti bahwa aktivitas hanya dapat dipanggil dengan menentukan nama kelas yang tepat. Ini menyiratkan bahwa aktivitas ditujukan hanya untuk penggunaan internal aplikasi (karena orang lain tidak akan mengetahui nama kelas). Jadi dalam kasus ini, nilai defaultnya adalah "false". Di sisi lain, keberadaan setidaknya satu filter menyiratkan bahwa aktivitas tersebut ditujukan untuk penggunaan eksternal, jadi nilai default-nya adalah "true".

Atribut ini bukan satu-satunya cara untuk membatasi eksposur aktivitas ke aplikasi lain. Anda juga dapat menggunakan izin untuk membatasi entitas eksternal yang dapat memanggil aktivitas (lihat atribut izin).

Prateek Thakur
sumber
2
Perbaiki setengah dari masalah saya, jika Anda mencoba menginstal aplikasi dengan layanan yang diekspor terlebih dahulu, kemudian menginstal aplikasi utama, Anda tidak akan pernah berhasil mencapai untuk menghapus layanan ... cara lain berfungsi dengan baik namun ... Ini karena izin yang diperlukan tidak ada saat menginstal aplikasi utama, tetapi saya tidak tahu bagaimana menyelesaikannya tanpa menghapus izin ...
Bibu
102

Itu java.lang.SecurityException Anda lihat adalah karena Anda mungkin memasukkan dua entri yang menunjuk ke aktivitas yang sama. Hapus yang kedua dan Anda harus pergi.

Penjelasan Lebih Lanjut

Anda dapat mendeklarasikan aktivitas 2 kali dalam manifes dengan properti berbeda, seperti:

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

dan

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

Anda harus menghapus yang tidak diinginkan dari manifes

Jomia
sumber
2
Anda dapat mendeklarasikan aktivitas 2 kali dalam manifes dengan properti berbeda, seperti: <activity android: name = ". myclass"> </activity> dan <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> < / aktivitas>. Anda harus menghapus yang tidak diinginkan dari manifes
Jomia
1
Jawaban bagus jomia Tapi satu pertanyaan, pada suatu waktu saya hanya memiliki satu aktivitas peluncur. Dan kode yang sama dijalankan dengan eumlaotr tetapi di perangkat itu menunjukkan pengecualian keamanan. Bisakah Anda menjelaskannya.
Tofeeq Ahmad
Saya rasa Anda harus mencopot pemasangan aplikasi di perangkat dan memasangnya kembali. Maka itu akan bekerja
Jomia
16

Di file Manifest Anda, tulis ini sebelumnya </application >

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

dan beri tahu saya jika itu menyelesaikan masalah Anda :)

Muhammad Shahab
sumber
baik dengan melihat log saya cukup yakin itu akan membantu. Lakukan satu hal, tempelkan file manifest lengkap Anda di sini
Muhammad Shahab
<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <using-permission android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <using-permission android: name = "android.permission.READ_CONTACTS" /> <using-permission android: name = "android.permission.READ_SYNC_SETTINGS" /> <using-permission android: name = "android.permission.READ_OWNER_DATA" /> <using-permission android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP
<using-permission android: name = "android.permission.INTERNET" /> <using-permission android: name = "android.permission.VIBRATE" /> <using-permission android: name = "android.permission.WAKE_LOCK" / > <using-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <application 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
Dalam 3 komentar di atas, saya telah menempelkan file manifes aplikasi Pemberitahu saya. Terima kasih untuk balasan Anda.
Swathi EP
7

Saya punya masalah dengan aktivitas ini.

Anda tidak dapat memulai com.fsck.k9.activity.MessageList dari aktivitas eksternal.

Saya menyelesaikannya dengan:

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

Menggunakan http://developer.android.com/reference/android/content/pm/PackageManager.html

pengguna1305537
sumber
6

Saya mengalami masalah yang sama dan ingin menghindari penambahan filter maksud seperti yang Anda jelaskan. Setelah menggali beberapa kali, saya menemukan atribut xml android: diekspor yang harus Anda tambahkan ke aktivitas yang ingin Anda panggil.

Ini secara default disetel ke false jika tidak ada filter maksud yang ditambahkan ke aktivitas Anda, tetapi jika Anda memiliki filter maksud, ini akan disetel ke true.

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

tl; dr: tambahkan android:exported="true"ke aktivitas Anda di file AndroidManifest.xml dan hindari menambahkan filter-maksud :)

Jason
sumber
1

Pastikan komponen memiliki tanda "diekspor" yang disetel ke true. Juga komponen yang menentukan izin harus dipasang sebelum komponen yang menggunakannya.

Naren
sumber
Anda juga harus memastikan bahwa Anda memiliki aplikasi di partisi sistem / priv-app untuk menikmati kemewahan tingkat Sistem. Ini diperlukan dalam perangkat KitKat selanjutnya
Naren
1

Sangat mudah mungkin Anda mengalami kesalahan dalam konfigurasi.

Misalnya: Manifest.xml

masukkan deskripsi gambar di sini

Tetapi dalam konfigurasi saya memiliki Activity default .Splash

masukkan deskripsi gambar di sini

Anda perlu memeriksa konfigurasi ini dan file Manifest.xml

Semoga berhasil

David Hackro
sumber
1

Saya menyelesaikan pengecualian ini dengan mengubah target sdkversi dari 19 versi kitkat dan seterusnyaAndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
Steve
sumber
BTW, saat ini Gradle menangani ini, dan pengembang Android tidak menentukan versi sdk dalam file manifes
kiedysktos
1
Ada solusi yang buruk. Jangan pernah menargetkan ke bawah.
Jared Burrows
Ini akan berhasil tetapi ada kemungkinan besar hal itu akan menyebabkan lebih banyak masalah daripada diselesaikan. Itulah pendapat saya
Evren Ozturk
0

Masalah saya adalah saya memiliki ini: salah Alih-alih ini: benar

Uriel Frankel
sumber