2016-09-02 20 views
1

私は、特定の拡張子(現在テスト目的でtxtを使用している)のファイルに対して電話機のメモリをスキャンする必要があるアプリケーションを作成しています。私はAndroidファイルシステムが実際にどのように動作するかを理解することに問題があります - 私は内部と外部の両方のSDカードにアクセスする方法を見つけました、私はルートフォルダからファイルエクスプローラで開くことができます。私はアプリからこれらのフォルダにアクセスすることはできません。ここでAndroid:ファイルをユーザーの記憶装置から読み取る

は私のコードです:ここでは

private void findTXT(File directory) { 
    directory.setReadable(true); //found this advice - doesnt help 

    if(directory.listFiles() != null) { //if not empty 
     for (File i : directory.listFiles()) { //iterate trough all files 
      try { 
       if (i.isDirectory()) //if it is directory 
        findTXT(i); //recurse 
       else if (MimeTypeMap.getFileExtensionFromUrl(i.toURI().toURL().toString()) == "txt") //check ending of regular file 
        files.add(i); //store it 
      } 
      catch(IOException e) {} 
     } 
    } 
} 

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

    TextView text = (TextView) findViewById(R.id.textView); 

    findTXT(new File("/sdcard/")); //this should be phones built-in memory 
    findTXT(new File("/mnt/sdcard")); //this is the same folder as above 
    findTXT(Environment.getExternalStorageDirectory()); //this one too 
    findTXT(new File("/mnt/ext_sdcard")); //this should be removable sdcard 

    for (File i : getExternalFilesDirs(null)) //this should be universal? 
     findTXT(i); 

    //list file names on screen 
    if(files != null) { 
     for (File i : files) 
      text.setText(text.getText() + i.getName() + "\n"); 
    } 
} 

は私の権限は、問題が/ SDカードまたは他のフォルダ内のアプリのdoesntのリストファイルという、あるマニフェスト

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

である - それはいるようです

/storage/emulated/0/Android/data/*com.mycompany.appname*/files 

私は理解していないパーミッションにいくつかの問題がありますか?でも、研究の数時間後、私はAndroid上でストレージがどのように機能するかを理解することは一切近い午前ないので...すべての答えのための

感謝:)

+0

次のように使用すると、アプリケーションレベルではないことはできレデラーを書くランタイムpermisiionを依頼する必要がありますroot許可なしのファイル –

+1

ああ、OK ...私はアプリケーションレベルのファイルは必要ない、私はユーザファイル(マルチメディア、ドキュメントなどの外部/内部SD上のファイル)が必要です。私は間違った場所を探していますか? –

+0

Ledererここを参照してくださいhttp://stackoverflow.com/questions/5858107/how-to-get-file-path-from-sd-card-in-android –

答えて

0

は、読み取りのための実行時のアクセス許可を与え、

if (Build.VERSION.SDK_INT >= 23 && 
       ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && 
       ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 

      ActivityCompat.requestPermissions((BaseActivity) context, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_READ_AND_WRITE_SDK); 
     } else { 
      callYourMethod(); 


     } 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_AND_WRITE_SDK: 

      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       callYourMethod(); 
      } 
      break; 


    } 
} 
+0

これは、おかげで助けて!私は、実行時のアクセス許可が現在必要であることを知りませんでした。 –

+0

ユーザーによって付与される2番目のアクセス許可もチェックする必要があります。 '(grantResults.length == 2 && grantResults [0] == PackageManager.PERMISSION_GRANTED && grantResults [1] == PackageManager.PERMISSION_GRANTED){...}' –

+0

コードはあなたの目標に効率的です –

0

すると、この

File directory = Environment.getExternalStorageDirectory(); 
List<File> files = getListFiles(directory); 
.... 
private List<File> getListFiles(File parentDir) { 
    ArrayList<File> inFiles = new ArrayList<File>(); 
    File[] files = parentDir.listFiles(); 
    for (File file : files) { 
     if (file.isDirectory()) { 
      inFiles.addAll(getListFiles(file)); 
     } else { 
      if(file.getName().endsWith(".csv")){ 
       inFiles.add(file); 
      } 
     } 
    } 
    return inFiles; 
} 

を試してみて、それがお役に立てば幸いです。あなたはAPIレベル23にしているなら、あなたは

+0

まだ同じ問題です... getExternalStorageDirectory()は "/ storage/emulated/0"を返します。これは空のフォルダのようです。エミュレータと私の電話の両方 –

+0

@トマスLedererそれはあなたのSdカードへのパスし、あなたがそこに行くだろうフォルダの名前を入力 –

関連する問題