Androidのインテントを介してあらゆる種類のファイルを選択する


95

あらゆる種類のファイルを返すことができるアプリのintentchooserを起動したい

現在使用しています(添付ファイルのAndroidメールソースコードからコピーしました)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

しかし、私のGalaxy S2では「ギャラリー」と「音楽プレーヤー」しか表示されません。このデバイスにファイルエクスプローラーがあり、リストに表示させたい。また、カメラアプリをリストに表示して、ユーザーが写真を撮影してアプリから送信できるようにしたいと考えています。Astroファイルマネージャーをインストールすると、その意図にも対応します。私の顧客はGalaxy SIIの所有者のみであり、すでに基本的で十分なファイルマネージャーを持っているという前提で、強制的にAstroファイルマネージャーをインストールしたくありません。

どうすればこれを達成できるのでしょうか?既定のファイルマネージャーがそのようなメニューに表示されてファイルを選択するのを見たことは確かですが、どのアプリで覚えているかわかりません。


写真を撮影してファイルを選択するには、非常に異なるコードが必要です。ほとんどのファイルエクスプローラーがファイルを返すことができるとは思いませんが、間違っている可能性があります。
dtech、2012年

主にアクセスする必要があるファイルの種類を指定できますか?
subrussn90 2012年

1
@dtech:ファイルエクスプローラーがファイルを返すことを期待していません。パスだけが必要です。
ErGo_404 2012年

@ subrussn90:ユーザーにあらゆる種類のファイルを選択させる必要があります。PDF、.doc、.zipなど、どのようなファイルでもかまいません。
ErGo_404 2012年

あなたはSDカード上の指定されたファイルのURIを取得するのに十分ですか???
subrussn90 2012年

回答:


88

カメラ用ではなく、他のファイル用です。

私のデバイスにES File Explorerインストールしましたが、これは私の場合に簡単に機能します。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

5
これは、サムスンのファイルエクスプローラで、このようなESファイルエクスプローラーまたはアストロファイルマネージャなどの外部ファイルエクスプローラ(と仕事をするではなく、彼らがそのアクションに対応するために、正しいインテントフィルタを実装していないことを奇妙に思える。。
ErGo_404

@Lukap-オープンソースのAndroidファイルマネージャーを使用してアプリケーションに統合すれば、サードパーティのアプリケーションは必要ありません。
user370305 2012

2
選択したファイルを取得するにはどうすればよいですか?それは道だと思いますが、どうですか?
フランシスココラレスモラレス

1
@FranciscoCorralesMorales-で- ファイルをonActivityResult()取得できUriます。
user370305 2014年

1
PICKFILE_RESULT_CODEする必要がありますPICKFILE_REQUEST_CODE
Aron Lorincz 2015

50

サムスンのファイルエクスプローラは、カスタムアクション(だけではなく、必要com.sec.android.app.myfiles.PICK_DATA)だけでなく、カテゴリの一部(テント。CATEGORY_DEFAULTを)とMIMEタイプは、余分として渡す必要があります。

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

このアクションを使用して、複数のファイルを開くこともできます。com.sec.android.app.myfiles.PICK_DATA_MULTIPLEとにかく、サムスンと他のデバイスで動作する私のソリューションは次のとおりです。

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

このソリューションは私にとってはうまく機能し、おそらく他の誰かにとっても役立つでしょう。


起動時にsIntentがどのタイプのファイルも受け入れないという事実を除いて、それはほとんど私にとっては機能します。フォルダを参照できますが、それだけです。
Radu 2013年

問題は、インテントにはmimeType: "file / *"が必要であり、Samsung sIntentには "* / *"が必要である-* / *の間にスペースがない
Radu

1
他の11kのAndroidデバイスはどうですか?
Oliver Dixon、2016年

1
このインテントのURIをどのように設定できますか?
PriyankaChauhan 2017

1
Samsung Intent( "com.sec.android.app.myfiles.PICK_DATA")の場合、文字列を追加して「FOLDERPATH」または「START_FOLDER」を追加することができます
Chupik

41

銀河の私のためのこの作品は、ショーの連絡先、デバイス、ギャラリー、音楽プレーヤーにインストールされているファイルマネージャーに注意してください

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

ここonActivityResultでアクティビティのパスを取得します。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}

6
取得したURIをutil.Fileに変換する方法
Anand Savjani

java.io.Fileの取得については不明ですが、次のようにして開くことができます。 developer.android.com/reference/android/content/...単純名を取得するにはどのようにここにある:stackoverflow.com/a/23270545/755313
demaksee

3
フォルダを選択するには?
hornet2319 2015年

6

これは私に最高の結果を与えます:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }

あなたはonActivityResultCode @Islam Khaled
Kishan Dongaを

1
3番目のオプションについては、org.openintents.action.PICK_FILEも参照してください。openintents.org/action/org-openintents-action-pick-fileこの コードでは、SamsungスマートフォンのすべてのユーザーがSamsungファイルマネージャーを使用し、(まだ)いることを前提としています。フォールバックとしてSamsungでintent.resolveActivityを使用すると、より堅牢になります。
Marcus Wolschon

1

Samsungファイルエクスプローラーがカスタムアクションを使用していることが判明しました。私がサムスンアプリからではなく、サムスンアプリからファイルを探すときに、サムスンファイルエクスプローラーが表示されたのはこのためです。

アクションは「com.sec.android.app.myfiles.PICK_DATA」です

両方のインテントをフィルタリングするアクティビティを表示するカスタムアクティビティピッカーを作成しました。


こんにちは、これについてもう少し説明してもらえますか?サムスンのギャラクシー電話では、Intent selectFile = new Intent( "com.sec.android.app.myfiles.PICK_DATA");を使用します。エラーが発生します
steliosf

今はよくわかりませんが、後で確認できます。アクティビティが見つかりませんでした例外だと思います。有効な解決策はありますか?私はほとんどすべてを試しましたが、どうにか修正できませんでした
steliosf

この意図は、Galaxy SIIで私に役立ちました。GT-B5510(Galaxy Y Pro)で試してみましたが、機能しませんでした。Samsungのすべてのデバイスをターゲットにしたい場合は、信頼できないと思います。結局、アプリケーションにオープンソースファイルマネージャーを統合することになりましたが、それはそのような基本的なニーズに対する重い解決策です。
ErGo_404

このインテントのURIをどのように設定できますか?
PriyankaChauhan 2017

0

これを知りたい場合は、ファイルピッカーを提供する小さくて使いやすいaFileDialogと呼ばれるオープンソースライブラリが存在します。

Android用の別のファイルチューザーのライブラリとの違いは、aFileDialogには、ファイルチューザーをダイアログおよびアクティビティとして開くオプションがあることです。

また、フォルダの選択、ファイルの作成、正規表現を使用したファイルのフィルタリング、確認ダイアログの表示もできます。


0

他の答えは間違っていません。ただし、ファイルを開くためのオプションが増えました。たとえば、アプリにファイルへの長期的な永続的なアクセスを許可する場合は、ACTION_OPEN_DOCUMENT代わりに使用できます。公式ドキュメントを参照してください:ストレージアクセスフレームワークを使用してファイルを開きますこの回答参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.