在使用cropIwa保存图像时需要帮助

时间:2018-08-06 04:33:01

标签: java android

我添加了一个目标文件,以将图像保存在应用程序的创建文件夹中。

static final File imageRoot = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), appDirectoryName);

cropIwa's documentation中,它需要destinationUri

这是我所做的:

cropIwaView.crop(new CropIwaSaveConfig.Builder(Uri.fromFile(imageRoot.getAbsoluteFile()))
                .setCompressFormat(Bitmap.CompressFormat.PNG)
                .setQuality(100) //Hint for lossy compression formats
                .build());

添加@Khaled Lela

cropIwaView.crop(new CropIwaSaveConfig.Builder(getUriFromFile(this, new File(R.xml.file_paths + ".png")))
                .setCompressFormat(Bitmap.CompressFormat.PNG)
                .setQuality(100) //Hint for lossy compression formats
                .build());

添加@Khaled Lela的cropiwa的saveCompleteListener。

cropIwaView.setCropSaveCompleteListener(new CropIwaView.CropSaveCompleteListener() {
            @Override
            public void onCroppedRegionSaved(Uri bitmapUri) {
                addPicToGallery(CropProfilePicture.this, bitmapUri);
                Toast.makeText(CropProfilePicture.this, "Done", Toast.LENGTH_SHORT).show();
                finish();
            }
        });

1 个答案:

答案 0 :(得分:0)

创建用于保存图像的临时文件

    // Create the File where the photo should go
    File photoFile = null;
    try {
        photoFile = createImageFile(context);
    } catch (IOException ex) {
        // Error occurred while creating the File
        Timber.e("Can't create photoFile:%s",ex.getMessage());
    }

private static File createImageFile(Context ctx) throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = ctx.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    return File.createTempFile(
            imageFileName,  /* prefix */
            ".png",         /* suffix */
            storageDir      /* directory */
    );
}

生成LOLLIPOP或更高版本的Uri并使用FileProvide

  final Uri imageUri ;
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP)
        imageUri = Uri.fromFile(photoFile); // file://
    else
        imageUri = getUriFromFile(context,photoFile); // FileProvider

保存图像逻辑

cropIwaView.setCropSaveCompleteListener(bitmapUri -> {
  addPicToGallery(context, bitmapUri); // sendBroadcast to gallery to scan new added images...
 });

cropIwaView.crop(new CropIwaSaveConfig.Builder(imageUri)
                .setCompressFormat(Bitmap.CompressFormat.PNG)
                .setQuality(100) //Hint for lossy compression formats
                .build());

在Android版本LOLLIPOP及更高版本中使用FileProvider

private static Uri getUriFromFile(Context context, File newFile) {
    return FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", newFile);
}
  • 在应用程序下添加 file_paths.xml

    <?xml version="1.0" encoding="utf-8"?>
      <paths>
      <external-path name="my_images" path="Android/data/com.your_package_id/files/Pictures" />
    </paths>
    
  • manifest.xml

    <application
     ...// other attributes 
     >
    
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.your_package_id.fileprovider"
        android:readPermission="com.your_package_id.fileprovider.READ"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    
    </application>
    
    • 添加权限

       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
       <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      

更新 更新图库中的图片。

private static void addPicToGallery(Context context, Uri contentUri) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(contentUri);
    context.sendBroadcast(mediaScanIntent);
}