【问题标题】:Not getting File from camera没有从相机获取文件
【发布时间】:2018-11-05 00:31:58
【问题描述】:

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

-打开相机

-拍照并保存图片

然后,当我将路径发送到另一个 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>

【问题讨论】:

    标签: java android android-contentprovider


    【解决方案1】:

    您可以尝试将图像作为位图,将其转换为 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);
    

    现在你有了位图,你可以用它做任何你想做的事情。

    【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-12-17
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多