web-dev-qa-db-ja.com

Android:Java.lang.SecurityException:許可の拒否:インテントの開始

他のアプリケーションから通知を表示するために呼び出されるGWVectraNotifierアクティビティを含むアプリケーションを作成しました。

通知ダイアログには、「表示」ボタンと「閉じる」ボタンがあります。

「表示」ボタンをクリックすると、対応するアクティビティが開始されます。

上記のアプリケーションの機能を確認するには、

CheckmailイベントトリガーでK9MailアプリケーションからGWVectraNotifierアクティビティを開始しました。

GWVectraNotifierアクティビティを正常に開始できますが、「show」ボタンのonclickでK9mailの「MessageList」アクティビティを開始する必要があります。そうするために、以下のコードを記述しました。

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)

実際、Notifierアプリケーションのマニフェストファイルに含める許可を理解して、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向けに記述された許可クラスであるためです。したがって、上記のアクセス許可には、Androidの組み込みアクセス許可のみを含めることができます。私もそうしようとしましたが、それは私の問題を解決しませんでした:(

110
Swathi EP

開始しようとしているアクティビティのマニフェストファイルにAndroid:exported="true"を追加する必要があります。

Android:exported documentation から:

Android:エクスポート済み
他のアプリケーションのコンポーネントによってアクティビティを起動できるかどうか-可能な場合は「true」、そうでない場合は「false」。 「false」の場合、アクティビティは、同じアプリケーションのコンポーネントまたは同じユーザーIDを持つアプリケーションによってのみ起動できます。

デフォルト値は、アクティビティにインテントフィルターが含まれているかどうかによって異なります。フィルタが存在しないということは、正確なクラス名を指定することによってのみアクティビティを呼び出すことができることを意味します。これは、アクティビティがアプリケーション内部での使用のみを目的としていることを意味します(他の人はクラス名を知らないため)。したがって、この場合、デフォルト値は「false」です。一方、少なくとも1つのフィルターが存在するということは、アクティビティが外部での使用を意図していることを意味するため、デフォルト値は「true」です。

この属性は、他のアプリケーションへのアクティビティの露出を制限する唯一の方法ではありません。許可を使用して、アクティビティを呼び出すことができる外部エンティティを制限することもできます(permission属性を参照)。

155
Prateek Thakur

表示されているJava.lang.SecurityExceptionは、同じアクティビティを指す2つのエントリを入力できるためです。 2番目のものを削除すると、準備完了です。

詳細説明

マニフェストでアクティビティを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>

マニフェストから不要なものを削除する必要があります

101
Jomia

マニフェストファイルで、</application >の前にこれを書いてください

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

それがあなたの問題を解決するかどうか教えてください:)

15
Muhammad Shahab

この正確なアクティビティでこの問題が発生しました。

外部アクティビティから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 を使用する

7
user1305537

私は同じ問題に直面していたので、あなたが説明したように意図フィルターを追加しないようにしたかったです。掘り下げた後、呼び出されるアクティビティに追加する必要があるxml属性Android:exportedが見つかりました。

インテントフィルターがアクティビティに追加されていない場合、デフォルトでfalseに設定されますが、インテントフィルターがある場合はtrueに設定されます。

ここにドキュメントがあります http://developer.Android.com/guide/topics/manifest/activity-element.html#exported

tl; dr:AndroidManifest.xmlファイルのアクティビティにaddAndroid:exported="true"を追加し、intent-filterの追加を避けます:)

6
Jason

コンポーネントの「エクスポート済み」フラグがtrueに設定されていることを確認してください。また、許可を定義するコンポーネントは、それを使用するコンポーネントの前にインストールする必要があります。

1
Naren

target sdkバージョンを19以降のKitKatバージョンAndroidManifest.xml.から変更して、この例外を解決しました

<uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="19" />
1
Stephen

たぶん、設定にエラーがあるかもしれません。

例:Manifest.xml

enter image description here

しかし、私の構成ではデフォルトのActivity .Splashがあります

enter image description here

この構成とファイルManifest.xmlが必要ですcheck

幸運

1
David Hackro

私の問題は、これがあることでした: wrong これの代わりに: correct

0
Uriel Frankel