40

これが私のコードですが、これは単一ファイルソリューション用です。

以下の単一ファイルの場合と同じように、複数のファイルとアップロードを共有できますか?

Button btn = (Button)findViewById(R.id.hello);

    btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_SEND);

                String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pic.png";
                File file = new File(path);

                MimeTypeMap type = MimeTypeMap.getSingleton();
                intent.setType(type.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(path)));

                intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                intent.putExtra(Intent.EXTRA_TEXT, "1111"); 
                startActivity(intent);
            }
        }); 
4

4 に答える 4

117

Intent.ACTION_SEND_MULTIPLEはい、代わりにを使用する必要がありますIntent.ACTION_SEND

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putExtra(Intent.EXTRA_SUBJECT, "Here are some files.");
intent.setType("image/jpeg"); /* This example is sharing jpeg images. */

ArrayList<Uri> files = new ArrayList<Uri>();

for(String path : filesToSend /* List of the files you want to send */) {
    File file = new File(path);
    Uri uri = Uri.fromFile(file);
    files.add(uri);
}

intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files);
startActivity(intent);

これは間違いなく単純化できますが、必要な各ステップを分解できるように、いくつかの行を残しました.

UPDATE : API 24 以降、ファイル URI を共有すると FileUriExposedException が発生します。これを解決するには、 compileSdkVersion を 23 以下に切り替えるか、 FileProviderでコンテンツ URI を使用します。

更新 (更新へ) : Google は最近、Play ストアにリリースする Android の最新バージョンの 1 つをターゲットにするには、新しいアプリとアプリの更新が必要になると発表しました。とはいえ、アプリをストアにリリースする予定がある場合、API 23 以下をターゲットにすることはもはや有効なオプションではありません。FileProvider ルートに進む必要があります。

于 2013-03-22T18:38:39.687 に答える
15

これは、MCeley のソリューションによって即興で作成された、少し改良されたバージョンです。これは、ダウンロードしたドキュメント、画像を同時にアップロードするなど、異種のファイルリスト (画像、ドキュメント、ビデオを同時に送信するなど) を送信するために使用できます。

public static void shareMultiple(List<File> files, Context context){

    ArrayList<Uri> uris = new ArrayList<>();
    for(File file: files){
        uris.add(Uri.fromFile(file));
    }
    final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    intent.setType("*/*");
    intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(intent, context.getString(R.string.ids_msg_share)));
}
于 2016-12-06T10:15:42.007 に答える
4

KitKat 以降を実行しているデバイスで別のアプリケーションとファイルを共有している場合は、Uri アクセス許可を提供する必要があります。


これは、KitKat の前後に複数のファイル共有を処理する方法です。

//All my paths will temporarily be retrieve into this ArrayList
//PathModel is a simple getter/setter
ArrayList<PathModel> pathList;
//All Uri's are retrieved into this ArrayList
ArrayList<Uri> uriArrayList = null;
//This is important since we are sending multiple files
Intent sharingIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
//Used temporarily to get Uri references
Uri shareFileUri;

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

    //My paths are stored in SQLite, I retrieve them first
    SQLiteHelper helper = new SQLiteHelper(this);
    pathList = helper.getAllAttachments(viewholderID);
    helper.close();

    //Create new instance of the ArrayList where the Uri will be stored
    uriArrayList = new ArrayList<>();

    //Get all paths from my PathModel
    for (PathModel data : pathList) {
        //Create a new file for each path
        File mFile = new File(data.getPath());
        //No need to add Uri permissions for pre-KitKat
        shareFileUri = Uri.fromFile(mFile);
        //Add Uri's to the Array that holds the Uri's
        uriArrayList.add(shareFileUri);
    }


} else {

    //My paths are stored in SQLite, I retrieve them first
    SQLiteHelper helper = new SQLiteHelper(this);
    pathList = helper.getAllAttachments(viewholderID);
    helper.close();

    //Create new instance of the ArrayList where the Uri will be stored
    uriArrayList = new ArrayList<>();

    //Get all paths from my PathModel
    for (PathModel data : pathList) {
        //Create a new file for each path
        File mFile = new File(data.getPath());
        //Now we need to grant Uri permissions (kitKat>)
        shareFileUri = FileProvider.getUriForFile(getApplication(), getApplication().getPackageName() + ".provider", mFile);
        //Add Uri's to the Array that holds the Uri's
        uriArrayList.add(shareFileUri);
    }

    //Grant read Uri permissions to the intent
    sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

}

//I know that the files which will be sent will be one of the following
sharingIntent.setType("application/pdf/*|image|video/*");
//pass the Array that holds the paths to the files
sharingIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriArrayList);
//Start intent by creating a chooser
startActivity(Intent.createChooser(sharingIntent, "Share using"));

私の場合、パスは に保存されていましSQLiteたが、パスはどこからでも取得できます。

于 2019-07-23T07:31:08.423 に答える