提问者:小点点

回主activity的延误


在主要activity,我称之为本地相机应用程序。那很好。然而,在快门点击后,相机返回到主activity。如果他们的照片拍得正确,那就好了。看起来相机需要一些时间来保存图片,离开相机app导致图片被解除。

不确定我需要做什么才能让相机有足够的时间保存图片!

   /** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}


public void openCamera(View view) {
    Log.i("Camera", "Inside openCamera");
    if ( checkCameraHardware(getApplicationContext())) {
        if ( Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_DENIED) {
                Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
                startActivity(intentCamera);
            } else {
                Log.i("Camera", "Camera not permitted");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0);
            }
        } else {
            Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
            startActivity(intentCamera);
        }
    }
}

共2个答案

匿名用户

在您的activity片段中尝试这样做。

static final int REQUEST_IMAGE_CAPTURE = 1;

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

并使用此重写方法取回图像...

@Override
public 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);
    }
}

示例示例遵循此链接

有两种意图:

显式意图通过提供目标应用程序的包名或完全限定的组件类名,指定哪个应用程序将满足意图。您通常使用explicit intent在自己的应用程序中启动组件,因为您知道要启动的activity或服务的类名。例如,您可以在应用程序中启动一个新的activity来响应用户的操作,或者启动一个服务来在后台下载文件。

Implicit Intents不命名特定的组件,而是声明要执行的常规操作,这允许来自另一个应用程序的组件处理它。例如,如果您想在地图上向用户显示一个位置,您可以使用一个隐含的意图来请求另一个有能力的应用程序在地图上显示一个指定的位置。更多信息

注意:-图像捕获是隐式意图。您必须使用StartActivityForResult()。它将使用你的操作系统软件app捕捉图像并返回给你的app。

匿名用户

I think you should use this api for camera it is easy to use and can solve your issue.

https://github.com/kosalgeek/PhotoUtil

 1. Download PhotoUtil.jar
 2. Copy it and paste into your Android project at App > libs > right click on the jar file and choose Add as Library

**Take a Photo using Camera**
1. Add Permissions
To use the camera, first you need to add permissions in AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...>
    <uses-feature android:name="android.hardware.camera2" android:required="true"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    ...
</manifest>
2. Dispatch a Camera and Save it to External Storage
2.1. To dispatch a camera and save a photo:
CameraPhoto cameraPhoto = new CameraPhoto(getApplicationContext());
Intent in = cameraPhoto.takePhotoIntent();
startActivityForResult(in, CAMERA_REQUEST);
2.2. To get the photo path
String photoPath = cameraPhoto.getPhotoPath(); //call it in onActivityResult() method
Snippet of code:
//declare them as global variables
CameraPhoto cameraPhoto;
final int CAMERA_REQUEST = 1100;
protected void onCreate(Bundle savedInstanceState) {
  ...
  //initialize it inside onCreate()
  cameraPhoto = new CameraPhoto(getApplicationContext());

  //call it to open the camera
  startActivityForResult(cameraPhoto.takePhotoIntent(), CAMERA_REQUEST);
  cameraPhoto.addToGallery();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == RESULT_OK){
      if(requestCode == CAMERA_REQUEST){
          String photoPath = cameraPhoto.getPhotoPath();
         try {
              Bitmap bitmap = ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
              imageView.setImageBitmap(bitmap); //imageView is your ImageView
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          }
      }
    }//end if resultCode
}