如何将URI作为jpg文件保存到内部存储的自定义文件夹中?

时间:2018-07-27 08:35:30

标签: java android internal-storage

我有一个包含“ 0 / data / app / data / croppedimage.jpg” 的URI,我想用新文件夹将其保存在内部存储中,其文件名如来自onActivity结果的“ /storage/emulated/0/myfolder/myimage.jpg”

下面给出了代码,

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        if (resultCode == RESULT_OK) {
            Uri resultUri = result.getUri();}}

我尝试使用FileOutputStream,但是myImage文件崩溃或损坏。

下面的代码

 File folderPath = new File(Environment.getExternalStorageDirectory() + "/OCR");

            if (!folderPath.exists()) {
                if (folderPath.mkdir()) ; //directory is created;
            } else {
                File photo = new File("/storage/emulated/0/myfolder/myimage.jpg");
                try {
                    FileOutputStream fileOutputStream = new FileOutputStream(photo);
                    fileOutputStream.write(Integer.parseInt(resultUri.toString()));
                    fileOutputStream.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

1 个答案:

答案 0 :(得分:0)

我认为您正在使用图片裁剪库。在这种情况下,您可以使用这样的FileProviders概念

  

您应该将软件包名称附加到com.yourpackagename.fileprovider之类的.fileprovider

将此添加到AndroidManifest.xml

 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.yourpackagename.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_path"/>
</provider>

在res文件夹内创建xml子文件夹,并在此子文件夹内添加此文件

provider_path.xml

  <?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path name="/storage/emulated/0" path="."/>
</paths>

将此作为全局变量添加到您的活动中

private static final String CAPTURE_IMAGE_FILE_PROVIDER = "com.yourpackage.name.fileprovider";

然后像这样更改您的startCropImageActivity()方法

    private void startCropImageActivity(Uri imageUri)
{
    File file = null;
    try
    {
        file = createImageFile();
        Uri mUri = FileProvider.getUriForFile(this,
                CAPTURE_IMAGE_FILE_PROVIDER, file);
        CropImage.activity(imageUri)
                .setGuidelines(CropImageView.Guidelines.ON)
                .setMultiTouchEnabled(true)
                .setAllowFlipping(false)
                .setAspectRatio(1, 1)
                .setRequestedSize(350, 350)
                .setMinCropResultSize(350, 350)
                .setMaxCropResultSize(800, 800)
                .setOutputCompressFormat(Bitmap.CompressFormat.PNG)
                .setOutputCompressQuality(90)
                .setOutputUri(mUri)
                .start(this);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

    private File createImageFile() throws IOException
{

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "MYAPPNAME-" + timeStamp + ".jpg";
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory(),
            "YourAppFolder");
    File storageDir = new File(mediaStorageDir + "/Profile_Images");
    if (!storageDir.exists())
    {
        storageDir.mkdirs();
    }
    File image = new File(storageDir, imageFileName);
    return image;
}

最后

@SuppressLint("NewApi")
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{

    // handle result of pick image chooser
    if (requestCode == CropImage.PICK_IMAGE_CHOOSER_REQUEST_CODE && resultCode == Activity.RESULT_OK)
    {
        Uri imageUri = CropImage.getPickImageResultUri(this, data);

        // For API >= 23 we need to check specifically that we have permissions to read external storage.
        if (CropImage.isReadExternalStoragePermissionsRequired(this, imageUri))
        {
            // request permissions and handle the result in onRequestPermissionsResult()
            mCropImageUri = imageUri;
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
        }
        else
        {
            // no permissions required or already grunted, can start crop image activity
            startCropImageActivity(imageUri);
        }
    }

    // handle result of CropImageActivity
    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        if (resultCode == RESULT_OK)
        {
            profileImageFilepath = result.getUri().getPath();
            Log.d("cropImageUri", result.getUri().getPath());
            new PostDataAsyncTask().execute();
            Toast.makeText(this, "Photo Selected Successfully", Toast.LENGTH_LONG).show();
        }
        else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
        {
            Toast.makeText(this, "Photo Selection Failed", Toast.LENGTH_SHORT).show();
        }
    }
}

获得

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

此解决方案会将您裁剪的图像保存到/storage/emulated/0/yourfolder/yourimage.jpg

相关问题