无法从相机获取文件

时间:2018-11-05 00:31:58

标签: java android android-contentprovider

我正在尝试制作图片,然后在其他活动中将其作为图片打开,但是我无法做到。 起作用的是:

-打开相机

-拍照并保存图像

然后,当我将路径发送到另一个Activity时,该路径上没有任何内容。

我正在使用provider,因为否则它将无法工作...

这是我在manifest.xml中的提供者

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"
                tools:replace="android:resource"/>
        </provider>

然后我用这个照相:

private void doTakePhotoAction() {

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        mImageCaptureUri = FileProvider.getUriForFile(TakePictureAndCropActivity.this, BuildConfig.APPLICATION_ID+".provider", new File(Environment.getExternalStorageDirectory(),
                "tmp_contact_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

        try {
            intent.putExtra("return-data", false);
            startActivityForResult(intent, PICK_FROM_CAMERA);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
        }
    }

然后将其发送到其他活动

Intent intent = new Intent(this, CropImage.class);
                intent.putExtra("image-path", mImageCaptureUri.getPath());
                intent.putExtra("scale", true);
                startActivity(intent);

它将返回“”这些方法

mImagePath = extras.getString("image-path");

            mSaveUri = getImageUri(mImagePath);
            if( extras.getString( MediaStore.EXTRA_OUTPUT ) != null ) mSaveUri = getImageUri( extras.getString( MediaStore.EXTRA_OUTPUT ) );

            mBitmap = getBitmap(mImagePath);

getImageUri很简单:return Uri.fromFile(new File(path));,这将返回我“ file:///external/tmp_contact_1541377710472.jpg”

然后我得到这个:

  

java.io.FileNotFoundException:/external/tmp_contact_1541377710472.jpg(无此类文件或目录)

通过provider_paths包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

1 个答案:

答案 0 :(得分:0)

您可以尝试做的是将图像作为位图,将其转换为ByteArray,将其按意图传递给下一个活动,然后在第二个活动中将其转换回位图。 (位图是图像文件格式的一种)。

获取位图:

 //This should be in your doTakePhotoAction() method.
 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 startActivityForResult(cameraIntent, 100);

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == 100) {
           Bitmap bitmap = ImagePicker.getImageFromResult(this, resultCode, data); 
        }
    }
    super.onActivityResult(requestCode, resultCode, data);

}

从startActivityForResult获取位图后,您可以执行以下操作:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
//convert to ByteArray
byte[] byteArray = stream.toByteArray();
//Add to intent
Intent intent = new Intent(this, MainActivity2.class);
intent.putExtra("image",byteArray);
startActivity(intent);

第二活动:

byte[] byteArray = getIntent().getByteArrayExtra("image");
//Convert back to Bitmap.
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

现在有了位图,就可以使用它进行任何操作。