如何复制图像文件从画廊到另一个文件夹编程在Android

bpzcxfmw  于 2023-03-11  发布在  Android
关注(0)|答案(6)|浏览(85)

我想从图库中选择图像,并将其复制到SDCard中的其他文件夹。
从图库中选取图像的代码

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_PICTURE_FROM_GALLARY);

我在活动结果上得到了这个URI。
我想复制图像,
表格path ="content://media/external/images/media/681
path = "file:///mnt/sdcard/sharedresources/这个路径的sdcard在Android.
如何做到这一点?

iibxawm4

iibxawm41#

感谢所有...工作代码在这里..

private OnClickListener photoAlbumListener = new OnClickListener(){
          @Override
          public void onClick(View arg0) {
            Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
            imagepath = Environment.getExternalStorageDirectory()+"/sharedresources/"+HelperFunctions.getDateTimeForFileName()+".png";
            uriImagePath = Uri.fromFile(new File(imagepath));
            photoPickerIntent.setType("image/*");
            photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT,uriImagePath);
            photoPickerIntent.putExtra("outputFormat",Bitmap.CompressFormat.PNG.name());
            photoPickerIntent.putExtra("return-data", true);
            startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_PICTURE_FROM_GALLARY);

          }
      };

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           if (resultCode == RESULT_OK) {
                switch(requestCode){
               
              
                 case 22:
                        Log.d("onActivityResult","uriImagePath Gallary :"+data.getData().toString());
                        Intent intentGallary = new Intent(mContext, ShareInfoActivity.class);
                        intentGallary.putExtra(IMAGE_DATA, uriImagePath);
                        intentGallary.putExtra(TYPE, "photo");
                        File f = new File(imagepath);
                        if (!f.exists())
                        {
                            try {
                                f.createNewFile();
                                copyFile(new File(getRealPathFromURI(data.getData())), f);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        
                        startActivity(intentGallary);
                        finish();
                 break;
                 
                 
                }
              }
           
           
        
          
        
   }

   private void copyFile(File sourceFile, File destFile) throws IOException {
            if (!sourceFile.exists()) {
                return;
            }
            
            FileChannel source = null;
                FileChannel destination = null;
                source = new FileInputStream(sourceFile).getChannel();
                destination = new FileOutputStream(destFile).getChannel();
                if (destination != null && source != null) {
                    destination.transferFrom(source, 0, source.size());
                }
                if (source != null) {
                    source.close();
                }
                if (destination != null) {
                    destination.close();
                }
            
            
    }

    private String getRealPathFromURI(Uri contentUri) {
    
       String[] proj = { MediaStore.Video.Media.DATA };
       Cursor cursor = managedQuery(contentUri, proj, null, null, null);
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       cursor.moveToFirst();
       return cursor.getString(column_index);
    }
ttygqcqt

ttygqcqt2#

OutputStream out;
            String root = Environment.getExternalStorageDirectory().getAbsolutePath()+"/";
            File createDir = new File(root+"Folder Name"+File.separator);
            if(!createDir.exists()) {
                createDir.mkdir();
            }
            File file = new File(root + "Folder Name" + File.separator +"Name of File");
            file.createNewFile();
            out = new FileOutputStream(file);                       

        out.write(data);
        out.close();

希望对我们有帮助

omjgkv6w

omjgkv6w3#

一种解决方案可以是,
1)从拾取文件的inputStream读取字节。
我在ActivityResult上得到这个URI“content://media/external/images/media/681”,你可以通过查询你得到的这个URI得到文件名,得到它的inputStream,读入byte[]。
给你/
Uri u = Uri.解析(“内容://媒体/外部/图像/媒体/681”);
游标cursor =内容解析器.query(u,空,空,空,空);有一个列名“_data”,它将返回文件名,从文件名可以创建输入流,
你现在可以读取这个输入流

byte data=new byte[fis.available()];
          fis.read(data);

所以你有数据(字节数组)和图像字节
2)在sdcard上创建一个文件,并写入第一步中的byte[]。

File file=new File(fileOnSD.getAbsolutePath() +"your foldername", fileName);
        FileOutputStream fout=new FileOutputStream(file, false);
        fout.write(data);

作为您已经从query方法中获得的fileName,请在此处使用相同的名称。

mpbci0fu

mpbci0fu4#

正在阅读this link,这里他们讨论了在Java中复制文件的四种方法,与Android也很相关。
虽然作者得出结论,使用@Prashant回答中使用的“频道”是最好的方法,但你甚至可以探索其他方法。
(我试过前两个,两个都能找到)

avkwfej4

avkwfej45#

尽管我已经通过了@AAnkit的投票,但我还是借用并修改了一些项目。他提到使用Cursor,但没有适当的说明,新手可能会感到困惑。
我认为这比投票最多的答案简单。

String mCurrentPhotoPath = "";

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
}

                   /*Then I proceed to select from gallery and when its done selecting it calls back the onActivityResult where I do some magic*/

private void snapOrSelectPicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(Intent.createChooser(takePictureIntent, "SELECT FILE"), 1001);
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {

        try {
            /*data.getDataString() contains your path="content://media/external/images/media/681 */

            Uri u = Uri.parse(data.getDataString());
            Cursor cursor = getContentResolver().query(u, null, null, null, null);
            cursor.moveToFirst();
            File doc = new File(cursor.getString(cursor.getColumnIndex("_data")));
            File dnote = new File(mCurrentPhotoPath);
            FileOutputStream fout = new FileOutputStream(dnote, false);
            fout.write(Files.toByteArray(doc));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
iqxoj9l9

iqxoj9l96#

您可以使用此功能中的内容解析程序将图像文件复制到任何其他文件夹目录

fun copyImageFileToMediaStore(
    context: Context,
    sourceFilePath: String,
    destinationFolder: File
) {
    val sourceFile = File(sourceFilePath)
    val extension = MimeTypeMap.getFileExtensionFromUrl(sourceFilePath)
    val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
    val fileName = sourceFile.name
    val inputStream = FileInputStream(sourceFile)
    val resolver: ContentResolver = context.contentResolver

    // Check if a file with the same name already exists in the destination folder
    val projection = arrayOf(MediaStore.MediaColumns._ID)
    val selection =
        "${MediaStore.MediaColumns.DISPLAY_NAME} = ? AND ${MediaStore.MediaColumns.RELATIVE_PATH} = ? AND ${MediaStore.MediaColumns.DATA} = ?"
    val selectionArgs = arrayOf(
        fileName,
        "${destinationFolder.path}/",
        destinationFolder.absolutePath + File.separator + fileName
    )
    val cursor = resolver.query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )
    if (cursor != null && cursor.count > 0) {
        // File already exists in the MediaStore, do not insert it again
        cursor.close()
        return
    }

    // File does not exist in the MediaStore, insert it
    val values = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
        put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
        put(MediaStore.MediaColumns.RELATIVE_PATH, destinationFolder.parent)
        put(
            MediaStore.MediaColumns.DATA,
            destinationFolder.absolutePath + File.separator + fileName
        )
    }
    var outputStream: FileOutputStream? = null
    var uri: Uri? = null
    try {
        val contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        uri = resolver.insert(contentUri, values)
        if (uri == null) {
            throw IOException("Failed to create new MediaStore record.")
        }
        outputStream = resolver.openOutputStream(uri) as FileOutputStream?
        if (outputStream == null) {
            throw IOException("Failed to get output stream.")
        }
        val buffer = ByteArray(4 * 1024)
        var read: Int
        while (inputStream.read(buffer).also { read = it } != -1) {
            outputStream.write(buffer, 0, read)
        }
        outputStream.flush()
    } catch (e: IOException) {
        uri?.let { resolver.delete(it, null, null) }
        uri = null
    } finally {
        inputStream.close()
        outputStream?.close()
    }
}

像这样调用这个函数

val destinationFolder = File("/storage/emulted/0/DCIM/foldername")
    val sourceFilePath = "/storage/emulted/0/DCIM/anyOtherFolder/abcd.jpeg"
    copyImageFileToMediaStore(requireContext(), sourceFilePath, destinationFolder)

相关问题