2015-09-14 38 views
7

私は、SDカードの一部のファイルにアクセスするためにAndroidストレージアクセスフレームワークを使用しています。デバイスの再起動後にファイルを編集できるようにするには、このパーミッションを維持することが重要です。ストレージアクセスフレームワークの永続パーミッションが動作しない

したがって、Storage Access Framework documentationによると、私は、デバイスが再起動されたとしても、ユーザーがあなたのアプリを通してファイルにアクセスし続けることができる永続的なアクセス許可を使用します。

しかし、しばらくして、私はいくつかのユーザーのためにアクセス許可がどうにか取り消されていることに気付きました。 SAFを書くためにSAFを使用しようとすると、その例外の後にandroid.system.ErrnoException: open failed: EACCES (Permission denied) が得られます。どのようなアクセス許可を使用しているのか確認します。mContext.getContentResolver().getPersistedUriPermissions()しかし、空のリストを返します。私は、ユーザーが私に正しい権限を与えて、その権限が現在インストールされているSdカードのものであると確信しています。

現在のところ、この場合はドキュメントピッカーを表示しています。ユーザーはもう一度新しい権限を提供することができますが、同じ操作を頻繁に実行するようにユーザーに求めるのはユーザーフレンドリーではありません。

権限の取り消しを引き起こす原因は何ですか?そして私はこの取り消しをどうやって防ぐことができますか?

すべてのデバイスで電話機を複数回再起動し、時間を変更して、SDカードを挿入しないでテストしましたが、セーフアクセス権を失うことはありませんでした。

私は許可を取得するための次のコードを持っている:ACTION_OPEN_DOCUMENT_TREEを要求するときに

private void openDocumentTree() { 
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { 
      Uri treeUri = data.getData(); 
      final int takeFlags = data.getFlags() & ( 
        Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      mContext.getContentResolver().takePersistableUriPermission(treeUri, 
        takeFlags); 

        //this is my internal class for saving and restoring tree uri permissions. 
        final Permission permission = Permission.from(treeUri); 
        mPermissionDao.save(permission); 
     } 
    } 
+1

のようになります。「私はAndroidのストレージアクセスフレームワークは、SDカード上のいくつかのファイルにアクセスする際に使用する」 - いいえ、あなたはで動作するようにSAFを使用していますドキュメント。それらの文書が保存されるかどうかは、あなたのものではなく、あなた次第です。それらはどのプロバイダ(Googleドライブ、Dropboxなど)でも管理できます。 「ユーザーが適切な権限を与えてくれると確信しています。権限は現在インストールされているSdカードのものです。なぜなら、データベース内のこのアクションを追跡するからです」 - ユーザーが選択したドキュメントはSDカードになくてもかまいません。 「パーミッションの取り消しを引き起こす原因は何ですか?」 - ユーザーがファイルをプロバイダから削除した可能性があります。 – CommonsWare

+0

私はSDカード上のファイルを扱うのにSafのみを使用しています。特定のアプリケーションのために、外部ストレージプロバイダと協力する理由があります。ツリーuriが外部ストレージの形式であることを確認します。 –

+0

おそらく、ユーザーがファイルをプロバイダから削除した可能性があります。外部記憶域のルートパスを表すツリーURIを受け取ったため、これは不可能です。それを削除する方法はありません。また、私が言及したように、新しいファイルを作成できませんでした( 'android.system.ErrnoException'を投げていました)、' getContentResolver()。getPersistedUriPermissions() 'が空のリストを返しました。したがって、ユーザーは何とか権限を取り消しました。 –

答えて

1

あなたは追加のフラグが必要です。

openDocumentTree

private void openDocumentTree() { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
    intent.addFlags(
     Intent.FLAG_GRANT_READ_URI_PERMISSION 
     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); 
    startActivityForResult(intent, REQUEST_CODE); 
} 

レビューFLAG_GRANT_PERSISTABLE_URI_PERMISSIONのためのドキュメントとFLAG_GRANT_PREFIX_URI_PERMISSION

関連する問題