使用相机拍摄,显示在ImageView上并保存到图片。

5
我很久以来一直在尝试制作一个简单的相机捕捉应用程序,但一直没有成功。几个月前我开发的这个应用程序非常好用,但自从我更新了Android到7版本后,这个应用程序就无法正常工作了。 我想点击一个按钮,激活相机(内置而不是API),然后捕捉图像并在ImageView中显示图像(高质量),并将图像保存到图片文件夹。之后再将图像发送到服务器。在我现有的应用程序版本中,我已经捕捉了图像,将保存的图像显示在ImageView中,并通过json发送到服务器。现在Activity结果为空,ImageView为空 :-( 请帮忙!
旧代码曾经很好用:
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.cancel_btn:
            finish();
            break;
        case R.id.camera_btn:
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
        Uri u = data.getData();
        Log.d("u", String.valueOf(u));
        theImageUriStr = String.valueOf(u);
        Log.d("theImageUriStr", String.valueOf(theImageUriStr));
        mImageView = (ImageView) findViewById(R.id.mImageView);
        ALBUM_ART_URI = Uri.parse(String.valueOf(theImageUriStr));
        Picasso.with(AddNewDish.this).load(ALBUM_ART_URI).into(mImageView);
    }
    else{
        Log.d("mmmm", String.valueOf(resultCode));
    }
}

我从Log.d中获取的结果是null,包括u和theImageUriStr。

你会检查用户是否有使用相机的权限吗? - K.Os
是的。同时检查读/写外部存储。 - Elidotnet
请详细解释一下“现在活动结果为空”的含义。另外,请提供一个 [mcve],其中包括调用 startActivityForResult() 以进行 CAMERA_REQUEST 的代码。例如,如果您正在使用 ACTION_IMAGE_CAPTURE,则 data.getData() 应该是 空的 - CommonsWare
CommonsWare,你有什么想法来解决这个空值问题吗?是的,我正在使用ACTION_IMAGE_CAPTURE。 - Elidotnet
2个回答

8

针对2017年的Android相机问题,目前唯一可行的方法就是使用革命性库:

https://github.com/gogopop/CameraKit-Android

这个库已经改变了Android开发中的一切 - 没有其他可行的方法。

Google(实际上是他们的日本办公室)最终决定自己编写软件来解决Android相机问题。这个软件是:https://github.com/google/cameraview。这个神奇的库把相机难度从10降到了5。

Flurgle库https://github.com/gogopop/CameraKit-Android是第一个成功解决所有问题并使相机像普通软件一样工作的库。现在难度只剩下1。

按照以下步骤将实时相机放入您的应用程序中。

<com.flurgle.camerakit.CameraView
    android:id="@+id/camera"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"/>

按照以下步骤拍照

cameraView.setCameraListener(new CameraListener() {
  @Override
  public void onPictureTaken(byte[] picture) {
   super.onPictureTaken(picture);
   Bitmap result = BitmapFactory.decodeByteArray(picture, 0, picture.length);
   save the image...
  });

一切都结束了。就这样。

与Android相机十年的生活地狱终于结束了。


在这个问题的SO海洋中,超过100行的答案中,这个看起来是最好的。非常感谢在这里分享。 - Gene Bo
@GeneBo - 没错。而且幸运的是,自那时以来的两年里它已经有了更大的改进!干杯! - Fattie

0

如果你想让内置相机应用程序拍照并将图像返回到你的应用程序,请按照以下步骤操作:

  1. 将以下内容添加到你的清单文件中:<uses-feature android:name="android.hardware.camera" android:required="true" />
  2. 在你的活动中使用此函数调用相机:

    private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, 1); } }

  3. 使用此函数处理从相机接收到的图像:

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); //mImageView.setImageBitmap(imageBitmap); } }

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接