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


112

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

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

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

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

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

GWVectraNotifierアクティビティを正常に開始できますが、「表示」ボタンをオンクリックすると、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"/>           

アプリに含める権限を誰かに教えてもらえますか?上記のパーミッションでは、k9専用に作成されたパーミッションクラスであるため、一部はk9mail専用です。だから、私は上記の与えられた許可にアンドロイドの組み込み許可を含めることができるだけです。私もそうすることを試みましたが、それは私の問題を解決しませんでした:(


AndroidManifest.xmlのMessageListアクティビティタグの下のマニフェストファイルに次のインテントフィルターを追加することでこれを解決しました:<intent-filter> <action android:name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP、2011

<intent-filter> <action android:name = "android.intent.action.MAIN" /> </ intent-filter>とandroid:exported = "true"の両方を追加しましたが、それでもjava.lang.securityを取得しています例外?これを解決するために私を助けていただけますか?
チャランパイ

回答:


155

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

エクスポートされたドキュメント:アンドロイド

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

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

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


2
私の問題の半分を修正します。最初にエクスポートされたサービスでアプリケーションをインストールし、次にメインアプリケーションをインストールしようとすると、サービスを削除するために到達することはできません。メインアプリのインストール時に必要な権限がありませんが、権限を削除せずに解決する方法がわかりません...
Bibu

102

表示さ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>

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


2
次のような異なるプロパティを持つマニフェストでアクティビティを2回宣言できます。 / app_name "> <intent-filter> <action android:name =" android.intent.action.MAIN "/> <category android:name =" android.intent.category.LAUNCHER "/> </ intent-filter> < / activity>。マニフェストから不要なものを削除する必要があります
Jomia '12

1
素晴らしい答えjomia。しかし、1つの質問、一度に1つのランチャーアクティビティしかありません。同じコードがeumlaotrで実行されますが、デバイスではセキュリティ例外が表示されます。詳しく説明してください。
Tofeeq Ahmad

デバイスのアプリをアンインストールして、再インストールする必要があると思います。その後、動作します
ジョミア

16

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

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

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


よくログを見て、私はそれが役立つだろうと確信していました。完全なマニフェストファイルをここに貼り付けてください
Muhammad Shahab 2010年

<マニフェストのxmlns:アンドロイド= " schemas.android.com/apk/res/android "パッケージ=" com.i10n.notifier"アンドロイドは:versionCode = "1"のandroid:versionName = "1.0"> <用途許可は、Android:名前を= "android.permission.RECEIVE_BOOT_COMPLETED" /> <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" />
Swathi EP 2010

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

上記の3つのコメントで、Notifierアプリケーションのマニフェストファイルを貼り付けました。お返事をありがとうございます。
Swathi EP 2010


6

私は同じ問題に遭遇していて、あなたが説明したようにインテントフィルターを追加することを避けたかったです。少し調べたところ、呼び出されたいアクティビティに追加する必要があるxml属性android:exportedが見つかりました。

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

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

tl; dr:android:exported="true"AndroidManifest.xmlファイルのアクティビティに追加し、インテントフィルターの追加を避けます:)


1

コンポーネントの "exported"フラグがtrueに設定されていることを確認してください。また、権限を定義するコンポーネントは、それを使用するコンポーネントの前にインストールする必要があります。


また、システムレベルの贅沢を楽しむには、システム/プライベートアプリパーティションにアプリがあることを確認する必要があります。これはKitKat以降のデバイスで必要です
Naren 2014

1

おそらく、構成にエラーがある可能性があります。

例:Manifest.xml

ここに画像の説明を入力してください

しかし、私の構成では、デフォルトのActivity .Splash

ここに画像の説明を入力してください

この構成とManifest.xmlファイルを確認する必要があります

幸運を


1

この例外を解決するには、target sdkバージョンを19以降のキットカットバージョンから変更しましたAndroidManifest.xml.

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

ところで、現時点ではGradleがこれを処理し、Android開発者はマニフェストファイルでsdkバージョンを指定していません
kiedysktos

1
ひどい解決策があります。決して下向きにターゲティングしないでください。
Jared Burrows

これは機能しますが、解決するよりも多くの問題を引き起こす可能性が高くなります。それは私の意見です
エブレンオズトゥルク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.