【问题标题】:Unable to display result of camera activity in ImageView无法在 ImageView 中显示相机活动的结果
【发布时间】:2017-02-10 04:48:42
【问题描述】:

基本上我想要做的是创建一个简单的应用程序,它使用默认的相机应用程序来拍照,然后我想在 ImageView 内的新活动中显示该图像,但我尝试的一切都导致了在

java.io.FileNotFoundException: /storage/emulated/0/imageToProcess.jpg: open failed: ENOENT (No such file or directory)

我在清单中包含了正确的权限(甚至可能太多):

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

如果在主要活动中需要,我也会手动请求权限:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if(checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
    }
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
    if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
    }
}

所以我认为问题不在于读/写权限。

在我的主要活动的 xml 文件中,我创建了一个带有 onClick 侦听器的按钮,该侦听器调用以下方法:

public void openCamera(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "imageToProcess.jpg");
    imgUri = Uri.fromFile(f);
    intent.putExtra("imgUri", imgUri.toString());
    startActivityForResult(intent, TAKE_PICTURE);
}

这是我定义的 onActivityResult() 方法,用于创建新意图并将 uri 传递给新活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if(requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK) {
        Intent camResult = new Intent(this, ShowCameraResult.class);
        camResult.putExtra("imgUri", imgUri.toString());
        startActivity(camResult);
    }
}

注意:imgUri 和 TAKE_PICTURE 在类的顶部定义为 protected static final int TAKE_PICTURE = 1;private Uri imgUri;

最后,这是我的 ShowCameraResult 活动

public class ShowCameraResult extends AppCompatActivity {
    private Bitmap mImageBitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_camera_result);
        ImageView imageView = (ImageView)findViewById(R.id.imageView);
        String filePath = getIntent().getStringExtra("imgUri");
        Log.d("ShowCameraResult", "directory: " + filePath);
        try {
            mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(filePath));
            imageView.setImageBitmap(mImageBitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的Log.d方法调用返回

ShowCameraResult: directory: file:///storage/emulated/0/imageToProcess.jpg

这让我相信相机的图像结果实际上并没有保存到我的 imageToProcess.jpg 文件中,但我可能大错特错,因为这是我从事的第一个真正的 android 项目。

所以我的问题是:我哪里做错了?

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 在设备而不是模拟器上测试
  • @Dhara 我在 Galaxy S5 上测试
  • 这是三星在其他设备上测试的错误
  • @DharaPatel 这不是三星的错误。它返回一个有效的文件路径

标签: java android android-camera capture


【解决方案1】:

IT 返回文件,而不是内容解析器 uri。只需使用 BitmapFactory 解码文件。

【讨论】:

  • 它返回一个文件的 URI。使用 BitmapFactory.decodeFile 获取文件的位图。然后显示那个。不需要内容解析器,它不返回 UR。它将文件存储在您意图要求的位置。
  • 哦,旁注 - 您不需要相机权限来启动相机意图。仅当您打算在应用中拍照时。
【解决方案2】:
 private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, TAKE_PICTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult: "+data);
        if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            Log.d(TAG, "onActivityResult: "+imageBitmap);
            imageView.setImageBitmap(imageBitmap);
        }
    }

SenderActivity:

Intent _intent = new Intent(this, newscreen.class);
Bitmap _bitmap; // your bitmap
ByteArrayOutputStream _bs = new ByteArrayOutputStream();
_bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs);
i.putExtra("byteArray", _bs.toByteArray());
startActivity(i);

ReciverActivity

if(getIntent().hasExtra("byteArray")) {
ImageView _imv= new ImageView(this);
Bitmap _bitmap = BitmapFactory.decodeByteArray(
        getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);        
_imv.setImageBitmap(_bitmap);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多