Задержка возврата к основной активности - PullRequest
0 голосов
/ 08 января 2019

В Main Activity я вызываю родное приложение Camera. Это хорошо. Однако после щелчка затвора камера возвращается к основному действию. Это было бы хорошо, если бы они были сделаны правильно. Похоже, что камере требуется некоторое время для сохранения изображения, а выход из приложения «Камера» приводит к отклонению изображения.

Не уверен, что мне нужно сделать, чтобы у камеры было достаточно времени для сохранения снимков!

   /** 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 ]

0 голосов
/ 08 января 2019
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
}
0 голосов
/ 08 января 2019

Попробуйте это в вашем Activity или Fragment.

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 intents укажите, какой application будет удовлетворять intent, указав либо имя пакета целевого приложения, либо полное имя класса компонента. Обычно вы используете explicit intent для запуска компонента в своем собственном приложении, поскольку вы знаете имя класса действия или службы, которую хотите запустить. Например, вы можете запустить новый activity в своем приложении в ответ на действие пользователя или запустить службу для загрузки файла в фоновом режиме.

Implicit intents не называют конкретный компонент, а вместо этого объявляют общее действие для выполнения, которое позволяет компоненту из другого приложения обрабатывать его. Например, если вы хотите показать пользователю местоположение на карте, вы можете использовать неявное намерение запросить, чтобы другое способное приложение показало указанное местоположение на карте. Подробнее

Примечание: - Захват изображения Implicit intent. Вы должны использовать startActivityforResult(). Он будет использовать ваше программное обеспечение ОС для захвата изображения и возврата к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...