web-dev-qa-db-ja.com

Android:Intentを使用して特定のフォルダーを開き、その内容をファイルブラウザーに表示する方法

これは簡単だと思いましたが、残念ながらそうではありません。

私が持っているもの:

外部ストレージに「myFolder」というフォルダーがあります(Nexus 4なのでsdカードではありませんが、それは問題ではないはずです)。このフォルダーには、いくつかの*.csvファイルが含まれています。

私が欲しいもの:

次のことを行うメソッドを作成したいと思います:さまざまなアプリ(ファイルブラウザー)を表示し、そこから1つを選択できます(図を参照)。クリックすると、選択したファイルブラウザが起動し、「myFolder」のコンテンツが表示されます。これ以上でもそれ以下でもない。

enter image description here

私の質問:

どのように正確に行うのですか?私は次のコードにかなり近づいたと思いますが、私が何をしても-私はまだ正しくないものがあるはずだと確信しています-それは常に外部ストレージからメインフォルダのみを開きます。

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);
}
62
kaolick

ようやく機能しました。このように、選択者によって表示されるアプリはわずかです(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"));
}
36
kaolick

これは動作するはずです:

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 現在の解決策が役に立たない場合。

60
Ayaz Alifov
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ドライブのコンテンツをダウンロードできます。

3
WayneSplatter

このコードは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

1
Abtin tashakor

今日では、Storage Access Frameworkから取得したcontent:URIを使用してフォルダーを表現し、それを開くには次のようにする必要があります。

Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);

残念ながら、ファイルアプリには現在、外部ストレージプロバイダーを使用してこれを試みるとクラッシュするバグが含まれています。ただし、サードパーティプロバイダーのフォルダーはこの方法で表示できます。

0
j__m