これは簡単だと思いましたが、残念ながらそうではありません。
私が持っているもの:
外部ストレージに「myFolder」というフォルダーがあります(Nexus 4なのでsdカードではありませんが、それは問題ではないはずです)。このフォルダーには、いくつかの*.csv
ファイルが含まれています。
私が欲しいもの:
次のことを行うメソッドを作成したいと思います:さまざまなアプリ(ファイルブラウザー)を表示し、そこから1つを選択できます(図を参照)。クリックすると、選択したファイルブラウザが起動し、「myFolder」のコンテンツが表示されます。これ以上でもそれ以下でもない。
私の質問:
どのように正確に行うのですか?私は次のコードにかなり近づいたと思いますが、私が何をしても-私はまだ正しくないものがあるはずだと確信しています-それは常に外部ストレージからメインフォルダのみを開きます。
public void openFolder()
{
File file = new File(Environment.getExternalStorageDirectory(),
"myFolder");
Log.d("path", file.toString());
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}
ようやく機能しました。このように、選択者によって表示されるアプリはわずかです(Googleドライブ、Dropbox、ルートエクスプローラー、およびソリッドエクスプローラー)。 2人のエクスプローラーでは正常に機能していますが、GoogleドライブとDropboxでは機能していません(外部ストレージにアクセスできないためだと思います)。 "*/*"
などの他のMIMEタイプも使用できます。
public void openFolder(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
+ File.separator + "myFolder" + File.separator);
intent.setDataAndType(uri, "text/csv");
startActivity(Intent.createChooser(intent, "Open folder"));
}
これは動作するはずです:
Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
if (intent.resolveActivityInfo(getPackageManager(), 0) != null)
{
startActivity(intent);
}
else
{
// if you reach this place, it means there is no any file
// Explorer app installed on your device
}
デバイスにファイルエクスプローラーアプリがインストールされていることを確認してください。
編集:コメントからシャンタンヌの推奨事項を追加しました。
ライブラリ:これらのファイル/ディレクトリ選択ライブラリを見ることができます https://Android-arsenal.com/tag/35 現在の解決策が役に立たない場合。
Intent chooser = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getDownloadCacheDirectory().getPath().toString());
chooser.addCategory(Intent.CATEGORY_OPENABLE);
chooser.setDataAndType(uri, "*/*");
// startActivity(chooser);
try {
startActivityForResult(chooser, SELECT_FILE);
}
catch (Android.content.ActivityNotFoundException ex)
{
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
上記のコードでは、setDataAndTypeが「*/*」の場合、「text/plain」を設定するとDropboxが開かれ、組み込みファイルブラウザーが開かれて任意のファイルが選択されます。 GoogleドライブをインストールしたDropboxがあります。 Dropboxをアンインストールすると、「*/*」のみがファイルブラウザを開くことができます。これはAndroid 4.4.2です。 getContentResolver()。openInputStream(data.getData())を使用して、DropboxおよびGoogleドライブのコンテンツをダウンロードできます。
このコードはOI File Managerで動作します:
File root = new File(Environment.getExternalStorageDirectory().getPath()
+ "/myFolder/");
Uri uri = Uri.fromFile(root);
Intent intent = new Intent();
intent.setAction(Android.content.Intent.ACTION_VIEW);
intent.setData(uri);
startActivityForResult(intent, 1);
ここでOIファイルマネージャーを取得できます。 http://www.openintents.org/en/filemanager
今日では、Storage Access Frameworkから取得したcontent:URIを使用してフォルダーを表現し、それを開くには次のようにする必要があります。
Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);
残念ながら、ファイルアプリには現在、外部ストレージプロバイダーを使用してこれを試みるとクラッシュするバグが含まれています。ただし、サードパーティプロバイダーのフォルダーはこの方法で表示できます。