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

标签 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();
            }
        });

最佳答案

创建应保存图像的临时文件

    // 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 */
    );
}

生成Uri并在LOLLIPOP及以上版本使用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());

使用FileProvider android LOLLIPOP 及以上版本

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>
    
  • list .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);
}

关于java - 在使用 cropIwa 保存图像时需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700584/

相关文章:

java - 使用反射来使用特定的类构造函数并创建新对象

android - 没有 url 的 TextView 上的超链接未显示且不可单击

android - 根据包裹内容设置 <fragment> 高度

android - 问题 : when save drawable or bitmap on sdcard?

java - 覆盖 JUnit 注释?

java - 具有返回接口(interface)的 Android 中的 AsyncTask

java - 迭代器的 next() 方法

java - 计算树中的左子节点

android - 使用内部应用程序共享来测试按需动态功能模块不起作用

android - FFMPEG Android 库增加大小