无法在ImageView

时间:2017-02-10 04:48:43

标签: java android android-camera capture

基本上我要做的是创建一个简单的应用程序,使用默认的相机应用程序拍照,然后我想在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项目。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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