2017-05-03 19 views
3

ContextCompat.getExternalFilesDirs(context, null)言う:なぜContextCompat.getExternalFilesDirsにアクセスできないのですか?

アプリケーションは、それが所有している永続的なファイルを置くことができ、すべての外部ストレージデバイス上のアプリケーション固有のディレクトリへの絶対パスを返します。

Huawei社の名誉は、Android 5.1.1を実行している。例えば、そのメソッドから以下を返す:

/storage/emulated/0/Android/data/my.package.name/files 
/storage/sdcard1/Android/data/my.package.name/files 

第ディレクトリリムーバブルSDカードです。しかし、そのディレクトリを読み書きしようとすると例外が発生します。android.system.ErrnoException: open failed: EACCES (Permission denied)

このアプリケーションにはWRITE_EXTERNAL_STORAGEがあります。 Android 4.4.4を実行しているSamsung Galaxy Note 4でもうまく動作します。これは5.1.1での問題であるため、Android 6.0のオプションの権限とは関係ありません。

APIにはthe application can place persistent files it ownsと表示されていますが、それは当てはまりません。

最近のSamsungデバイスを含め、他のデバイスからのレポートも聞いたことがあります。これは、これを正しく実装していないOEMか、Androidの複雑なストレージフレームワークに欠けているものがありますか?

これはこのデバイスと一部のデバイスでこれを実証するコードです。

File removable = ContextCompat.getExternalFilesDirs(context, null)[1]; 
if (removable.exists() && removable.canRead() && removable.canWrite()) { 
    File test = new File(removable, "test"); 
    test.createNewFile(); // Throws the exception mentioned above 
} 

このディレクトリにmkdirファイルを作成、移動、または移動しようとすると、失敗します。

+0

「私はそのディレクトリに読み取りまたは書き込みをしようとした場合を」フォーマットする必要がありますか?あなたはそれらの2つを挙げる。 「アプリにはWRITE_EXTERNAL_STORAGEがあります」 - これはAndroid 4.4以降の場所とは関係ありません。 – CommonsWare

+0

上記の更新。 2番目はリムーバブルSDカードです。 – cottonBallPaws

+0

さて、あなたはそれへの読み書きアクセスが必要です。完全なスタックトレースと共に、失敗したコードを投稿することを検討するかもしれません。 IMHOでは、メーカーが外付けストレージよりもリムーバブルストレージを台無しにする可能性が高いです。 – CommonsWare

答えて

1

まあ、私はこの活動にあなたのコードをラップ:

package com.commonsware.myapplication; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import android.widget.Toast; 
import java.io.File; 
import java.io.IOException; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    File removable = ContextCompat.getExternalFilesDirs(this, null)[1]; 
    if (removable.exists() && removable.canRead() && removable.canWrite()) { 
     File test = new File(removable, "test"); 
     try { 
     test.createNewFile(); // Throws the exception mentioned above 
     } 
     catch (IOException e) { 
     Log.e(getClass().getSimpleName(), "Exception creating file", e); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    } 
    } 
} 

それは、Android 6.0.1を実行している、Huawei社の名誉5X上の細かい動作します:

$ adb shell ls -al /storage/1A30-3598/Android/data/com.commonsware.myapplication/files 
-rwxrwx--x u0_a29 sdcard_rw  0 2017-05-03 18:02 test 

だから、私の推測では、このことですデバイス固有の非互換性です。

+0

そうですね... – cottonBallPaws

+0

@CommonsWare – Grendel

0

多くの理由から、@ CommonSWareがArrayIndexOutOfBoundsExceptionなしで実行するコードを取得した方法についてお問い合わせしたいと思います。長さ= 1; index = 1 ERROR [0]を[0]に設定する必要があるこのコンセプトをテストして、ユーザーが内部ストレージまたは外部ストレージを選択できるようにする方法を記述しています。誰かがこの動作の仕組みや動作しない理由ディレクトリ - 私たちのために 上記の答えは、このよう

 File removable = ContextCompat.getExternalFilesDirs(this,null)[0]; 
    if (removable.exists() && removable.canRead() && removable.canWrite()) { 

     THE_PATH = String.valueOf(removable); 
     THE_PATH = THE_PATH + "/Documents/"; 

    }else { 
     Toast.makeText(getApplicationContext(),"NO SD CARD", 
    Toast.LENGTH_LONG).show(); 

    } 
+0

のような質問のようなものです。これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 18983815) –

+0

新しい質問がある場合は、[質問する](https://stackoverflow.com/questions/ask)ボタンをクリックしてください。コンテキストを提供する場合は、この質問へのリンクを含めてください。 - [レビューの投稿](/レビュー/低品質の投稿/ 18983815) –

関連する問題