2015-10-23 60 views
13

Android 6.0エミュレータのsdcardからjpegファイルを読み込みたいが、ファイルリストはnullを返す。サンプルコードは私の電話でも使えます:Android 6.0エミュレータでlistFiles()がnullを返す

  String sdcard = Environment.getExternalStorageDirectory().toString(); 
      File sdcard_dir = new File(sdcard); 
      if (sdcard_dir.isDirectory()) { 
       File[] fileNames = sdcard_dir.listFiles(new FileFilter() { 
        @Override 
        public boolean accept(File pathname) { 
         return pathname.toString().endsWith(".jpg") ? true : false; 
        } 
       }); 
      } 

fileNames = null!

私はエミュレータ上の画像ファイルを一覧表示するadbのシェルを使用することができます。

enter image description here

許可のAndroidManifest.xmlに追加されました:他に

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

何か私は行うことができますか?

これまでのところ私のデバイスをAndroid 6.0にアップグレードすることができないため、エミュレータを使用する必要があり、新しいAPIをいくつか試してみたいと思います。

答えて

9

Android 6.0では、実行時アクセス許可が導入されました。マニフェストのパーミッションを宣言することに加えて、実行時にそのパーミッションをユーザに要求する必要があります。ここ

詳細情報とチュートリアル:http://developer.android.com/training/permissions/requesting.html

+0

解決済み!ありがとう! – yushulx

+2

私はruntime.butでユーザーからの同じissue.Requested権限を持っていますが、問題を解決することはできません。 – krishna

8

私もアンドロイド6.0で必要なランタイム権限コードを追加した後、まったく同じ問題を観察しています。私の活動で

私は、次のコードを持っている:

int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 
    int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
          Manifest.permission.READ_EXTERNAL_STORAGE}, 
       REQUEST_READWRITE_STORAGE); 
    } 

を、ユーザーが読み取り/書き込みストレージの権限の要求を確認すると、私は予想されるコールバックを受け取ります。

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String[] permissions, 
             int[] grantResults) { 
    if (requestCode == REQUEST_READWRITE_STORAGE) { 
     if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { 
      finishCreationStep(); 
     } 
    } 
} 

私は両方の読み取りおよび書き込み権限が付与されているデバッガで確認しました。しかし、その後に実行される読み取りストレージの呼び出しは失敗します。

File[] possible_files = mrpDir.listFiles(); 

listFiles()を呼び出すとnullが返されます。私がアプリケーションを終了し、設定>アプリケーションのアプリケーションに行くと、ストレージのアクセス許可が与えられていることがわかります。私はまた、アプリケーションを終了し、それを再起動すると、アクセス許可が期待どおりに存在し、listFiles()呼び出しが正常に動作します。つまり、パーミッションの変更は、アプリケーションが終了して再起動されるまで有効になりません。変更されたアクセス許可をアプリケーションに認識させて、ユーザーを手動で終了して再起動させる必要はありません。

私は現在Android 6デバイスにアクセスできないので、このスレッドの創始者と同じように、API 23エミュレータで動作しています。だから、エミュレータに問題がある可能性があると思います。しかし、それは起こりそうにない。

1

最初の通話

if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
         Manifest.permission.READ_EXTERNAL_STORAGE}, 
      REQUEST_READWRITE_STORAGE); 
} 

は、あなたが権限を持っているかどうかを確認することです。あなたが持っていない場合、アクセス許可、コールバックが呼び出されます。これは初めてのことです。

その後、既にアクセス許可を持っているため、コールバックは呼び出されません。したがって、あなたのコードは次のようになります

関連する問題