web-dev-qa-db-ja.com

URIから起動しようとすると、「エクスポートされたアクティビティには許可は必要ありません」

this Android question を参照として使用して、URIからSOアプリを起動しようとしています。

次の宣言されたアクティビティを含むマニフェストファイルがあります。

<activity Android:name=".MainActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <data Android:scheme="http" Android:Host="example.com" />
    </intent-filter>
</activity>

http://example.com リンクを使用してMainActivityを起動しようとしています。私の問題は、警告が表示されることです

"exported activity does not require permission"

私はこれと同じ警告を報告する他のSOの質問を調べましたが、すべてのソリューションが機能していないようです。

警告を回避するために、アクティビティインテントフィルタを正しく作成するにはどうすればよいですか?

ありがとう

36
Brad

SDKをバージョン20 に更新したときに同じ問題が発生しました。 Android:exported プロパティを追加して削除しました:

<activity 
  Android:name=".MainActivity"
  Android:exported="false">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <data Android:scheme="http" Android:Host="example.com" />
    </intent-filter>
</activity>

マニフェストのアクティビティ宣言内。もちろん、アクティビティがアプリケーション内部での使用のみを目的としている場合は、これを指定できます

それを修正する理由は docs にあります:

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

"エクスポートされた受信者は許可を必要としません"(少なくともLINTメッセージは明確です)なので、あなたはそれを得ました。

91
Shine

プロジェクトをクリーンアップしようとしましたか(プロジェクト>クリーン...)?私のプロジェクトでこの警告を修正しました。おそらくあなたのものです。

40
cleroo

この警告を取り除くには、2つの選択肢があります。

  • アクティビティの属性Android:exported="false"に設定して、他のアプリがインテントを介してActivityを呼び出さないようにする
  • または、他のアプリにアクティビティの呼び出しを許可するが必要な場合は、アプリに許可を指定できるAndroid:permission属性を追加する必要がありますアクティビティを呼び出すために必要です。
  • 他のアプリが特別な許可なしにアクティビティを呼び出すことを許可したい場合は、マニフェストに警告を表示する必要があります。

詳細については、 Androidドキュメント をご覧ください。

リンクについて @ furykid に感謝します。

18
white_gecko