2017-03-27 13 views
0

写真を選択して「共有」します。ターゲットアプリケーションでは、意図とファイルパスからUriを取得します。 が開き失敗しました::EACCES(パーミッション拒否)Nexus 5、os M 6.0.1、およびCameraアプリで 'storage'の許可なしで共有ファイルにアクセスする方法

それが原因で許可されていない「ストレージ」の権限であるが、特に許可をユーザーに依頼したくない新しいFileInputStreamを(新しいファイル(pathToFile))を行うことがスロー 'storage'権限。 「保管」の許可なくファイルを読み取る別の方法はありますか?

if (Intent.ACTION_SEND.equals(action) && 
    intent.hasExtra(Intent.EXTRA_STREAM)) { 

Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 

String filePath; 

Cursor cursor = null; 
final String column = "_data"; 
final String[] projection = { column }; 
try { 
    cursor = context.getContentResolver().query(uri, projection, null, null, 
        null); 
    if (cursor != null && cursor.moveToFirst()) { 
     final int column_index = cursor.getColumnIndexOrThrow(column); 
     filePath = cursor.getString(column_index);   
    } 
} catch(Exception e){ 
    return getFilePathFromInputStream(context, uri); 
} 
finally { 
      if (cursor != null) 
       cursor.close(); 
} 

// upto here got filePath = 
    /storage/emulated/0/DCIM/Camera/IMG_20170326_184502.jpg 

boolean b = false; 
try{ 
    File f2 = new File(filePath); 
    b = f2.exists(); 
} catch(Exception e) { 
    Log.e("+++ exception e:"+e.getMessage()); 
} catch(Error e) { 
    Log.e("+++ error e:"+e.getMessage()); 
} 

// unto here no exception, then 

fileInputStream = new FileInputStream(new File(filePath)); //<=== here throws 

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20170326_184502.jpg: open failed: EACCES (Permission denied) 
+0

あなたが受け取った実際の「uri」は何ですか? – ianhanniballake

答えて

0

あなたは「「ストレージ」の許可なしにファイルを読み込む」場合:

これは、ファイル・パスを抽出する方法です。あなたはdown targetSdkVersionが必要です。 build.gradleファイルコンテナ "applicationId"を編集し、タグ "defaultConfig"で "targetSdkVersion 22"を使用できます。

+0

ありがとうございますが、APIレベルを置くことはできません。提案のおかげで – lannyf

2

そのuriからファイルパスを抽出しないでください。

uriを次のアプリに渡すだけです。

uriからファイルパスを抽出しないでください。代わりに、uriの入力ストリームを直接開きます。ファイル入力ストリームではありません。

あなたは次のアプリにuriを渡すのに十分なトラブルがあります。

あなたは簡単にuriを渡すことができますが、取得したアクセス権を転送できなかったので、次のアプリケーションはそれを読むことができません。

代わりに、コンテンツプロバイダを使用して選択したファイルを配信することができます。

+0

ありがとう。 「絶対にuriからファイルパスを抽出しようとしません。その代わりにuriの入力ストリームを直接開きます。 btw私は次のアプリに渡すためにuriを作成していない、それは 'カメラ'アプリのギャラリーから共有することです、私のアプリは '次の'アプリです。 – lannyf

関連する問題