22496


Androidで、ストレージ内の特定の拡張子をListに追加して、リストに表示するようにしたいです。  
再帰の時、一つ上のディレクトリではなく、/sdcardを終了してしまいます。  
何故でしょうか？

MainActivity.java

[code]

    public class MainActivity extends AppCompatActivity {
        private String sdPath = getExternalStoragePath();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            new MyAsyncTask(this).execute(new File(sdPath));
        }
    
    
    
        // 外部ストレージ(SDカード)のパスを取得する。
        public static String getExternalStoragePath() {
            String path;
            // MOTOROLA 対応
            path = System.getenv("EXTERNAL_ALT_STORAGE");
            if (path != null) {
                return path;
            }
            // Samsung 対応
            path = System.getenv("EXTERNAL_STORAGE2");
            if (path != null) {
                return path;
            }
            // 旧 Samsung + 標準 対応
            path = System.getenv("EXTERNAL_STORAGE");
            if (path == null) {
                path = Environment.getExternalStorageDirectory().getPath();
            }
            // HTC 対応
            File file = new File(path + "/ext_sd");
            if (file.exists()) {
                path = file.getPath();
            }
            // その他機種
            return path;
        }
    }
    
[/code]

MyAsyncTask.java

[code]

    public class MyAsyncTask extends AsyncTask<File, Void, String> {
        Context context;
        private File[] files;
        private List<String> pickedFileList = new ArrayList<String>();
        private ListView lv;
    
        public MyAsyncTask(Context context) {
            this.context = context;
        }
    
        @Override
        protected String doInBackground(File... params) {
            pickOnDir(params[0]);
            return "hoge";
        }
    
        public void pickOnDir(File dir) {
        files = dir.listFiles();
        if (files != null) {
            Log.d("file Info", dir.getAbsolutePath() + "を検索中...");
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    Log.d("file Info", files[i].getAbsolutePath() + "にフォルダを確認しました");
                    pickOnDir(files[i]);
                }else if (files[i].isFile()) {
                    if (files[i].getName().endsWith(".js")) {
                        Log.d("file Info", files[i].getAbsolutePath() + "にJSファイルを確認しました");
                        pickedFileList.add(files[i].getAbsolutePath());
                    } else {
                        Log.d("file Info", files[i].getAbsolutePath() + "にファイルを確認しました");
                    }
                } else {
                    Log.d("file Info", files[i].getAbsolutePath() + "は不明なファイルです");
                }
            }
            Log.d("file Info", dir.getAbsolutePath() + "の検索を完了したので戻ります");
            return;
        }
    }
    
        @Override
        protected void onPostExecute(String results) {
            lv = (ListView) ((Activity) this.context).findViewById(R.id.listView);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.context, android.R.layout.simple_expandable_list_item_1, pickedFileList);
            lv.setAdapter(adapter);
        }
    }
    
[/code]

ログ

/sdcardを検索中...  
/sdcard/DCIMにフォルダを確認しました  
/sdcard/DCIM/Cameraにフォルダを確認しました  
/sdcard/DCIM/Cameraを検索中...  
/sdcard/DCIM/Camera/XXX.jpgにファイルを確認しました  
/sdcardの検索を完了したので戻ります


CC BY-SA 3.0
2016-02-24T07:05:13.817
22473
2016-02-25T02:35:05.080
2016-02-25T02:35:05.080
13588
13588
question
android
Androidでストレージの中から特定の拡張子だけを検索してリストに表示したい


メインスレッドからこのコードを実行すると、大抵の端末では止まると思います。所謂ANR(Application Not
Responding)が発生したのではないでしょうか？これは、メインスレッドで5秒以上かかる処理をやった場合に起こります。ファイルの検索は時間がかかるため、別スレッドで行うべきです。


CC BY-SA 3.0
2016-02-25T00:55:46.517
22496
2016-02-25T01:04:07.273
2016-02-25T01:04:07.273
8795
8795
22473
answer