2017-12-05 19 views
1

ACTION_OPEN_DOCUMENTを使用してPDF文書を選択するようにユーザーに依頼します。インテントはコンテンツURIを返します。PDFを開くときにIntent.ACTION_VIEWでSecurityExceptionが発生する

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.setType("application/pdf"); 
    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); 
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 

URIフォーマットであるコンテンツ - コンテンツ://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf

これで、ユーザーは別のアクティビティから、後で同じ文書に再びアクセスする必要があります。だから私は、次のコードを書く -

Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
        pdfIntent.setData(document.getLocalUri()); 
        pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
        mContext.startActivity(pdfIntent); 

をしかし、私は次のエラーを取得する -

java.lang.SecurityException: UID 10197 does not have permission to content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs 

私が間違って何をしているのですか?

+0

あなたはマニフェストでパーミッションを宣言しましたか? –

+0

この行をマニフェスト 'に追加してください。 –

答えて

0

私は間違っていますか?ほとんどの場合、あなたの問題はここにある

私は、ユーザーが再び同じドキュメントにアクセスしたい - 後で、別の活動から

要求し、受信した活動コンテンツへのUriにはそのコンテンツに対する権利がありますが、あなたのアプリの他には何もありません。これには、現在のプロセス内の他のコンポーネントが含まれます。

これは別のアクティビティですが、同じアプリインスタンス内にある場合(つまり、Uriを取得してからプロセスが終了していない)、そのコンテンツの権利を別のアクティビティに渡す必要があります。 UriIntentの "データ"ファセットで渡し、ACTION_VIEWIntentでやっているようにsetFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)を使用します。 this sample appを参照してください。FLAG_GRANT_READ_URI_PERMISSIONを使用して、Serviceにコンテンツを読み取る権利を与えます。

あなたの意図がUri値自体を持続(例えば、データベース内の文字列として保存)し、将来的にそれを使用する場合は、代わりに、コンテンツへの長期的なアクセスを要求するためにContentResolvertakePersistableUriPermission()を使用することができます。これは成功するはずです(アクセスがすぐに拒否されるシナリオはわかりません)。ユーザーがコンテンツを削除するなど、内容が劇的に変化するまでは、アクセス権が必要です。

+0

ありがとうございました。 takePersistableUriPermission()は私が必要としていたものです。私はちょうどあなたのブログを見に来た - https://commonsware.com/blog/2016/03/15/how-consume-content-uri.html - 私のために多くのURIの混乱をクリア:) – user3911483

関連する問題