onActivityResult не вызывается после съемки камеры

Я делаю приложение для Android, в котором у меня есть функциональность, мне нужно открыть камеру и сделать снимок. После съемки onActivityResult не вызывается. мой экран остается только в состоянии камеры.

Мой код:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File mediaFile = new File(
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath());
Uri imageUri = Uri.fromFile(mediaFile);
         intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
         startActivityForResult(intent, 1);

Код onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null && !data.toString().equalsIgnoreCase("Intent {  }"))
        switch (requestCode) {
        case 1:
            Log.i("StartUpActivity", "Photo Captured");
             Uri uri = data.getData();
             String imgPath = getRealPathFromURI(uri);
            bitmap = (Bitmap) data.getExtras().get("data");
            MediaStore.Images.Media.insertImage(getContentResolver(),
                    bitmap, null, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            img1.setImageBitmap(bitmap);
}
}

person user2085965    schedule 30.12.2013    source источник
comment
сделайте super.onActivityResult() последней инструкцией вашего onActivityResult() переопределенного метода. обратитесь к этому руководству по Android, чтобы проверить его: developer.android.com/guide/topics /media/camera.html Попробуйте добавить журнал, чтобы проверить, действительно ли вызывается onActivityResult или нет.   -  person Houcine    schedule 30.12.2013
comment
Я ответил на этот вопрос, прежде чем взглянуть: stackoverflow.com/a/30266776/1531683   -  person sadegh saati    schedule 15.05.2015


Ответы (7)


Вероятно, вызывается onActivityResult, но операторы внутри вашего оператора if и оператора switch/case не выполняются, потому что они никогда не достигаются.

Код ниже включает два метода takePhoto и onActivityResult, он очень короткий и отлично работает. Взгляните на него, возможно, он вам поможет!

public void takePhoto(View v) {
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_REQUEST);
  }

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
      photo = (Bitmap) data.getExtras().get("data");
      imageView.setImageBitmap(photo);
    }
  }
person Karim    schedule 30.12.2013

Вы можете запустить свое приложение в режиме отладки после установки точки останова в методе onActivityResult, если оно останавливается там после получения из камеры, то оно вызывается успешно.

и вы могли бы просто изменить оператор if, который вы используете, сделав свой код таким:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null && resultCode = RESULT_OK)
        switch (requestCode) {
        case 1:
            Log.i("StartUpActivity", "Photo Captured");
             Uri uri = data.getData();
             String imgPath = getRealPathFromURI(uri);
            bitmap = (Bitmap) data.getExtras().get("data");
            MediaStore.Images.Media.insertImage(getContentResolver(),
                    bitmap, null, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            img1.setImageBitmap(bitmap);
      }
}

и обратите внимание, что рекомендуется использовать окончательные целые числа в качестве кода запроса, а не переписывать их каждый раз, когда они необходимы, например:

private final int START_CAMERA_REQUEST_CODE = 1;
person Triple.B    schedule 20.02.2014

Я думаю, это может помочь вам

Шаг за шагом следуйте приведенному ниже коду и сравните с вашим кодом, чтобы избежать нулевого исключения.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 1);

1 Результат OnActivity

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
     if (requestCode == 1)
            onCaptureImageResult(data);
    }
}

2 onCaptureImageResult

 public void onCaptureImageResult(Intent data) {
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

    Uri tempUri = getImageUri(getApplicationContext(), thumbnail); // call getImageUri

    File finalFile = new File(getRealPathFromURI(tempUri));
    file_path = finalFile.getPath().toString(); // your file path
    imgview.setImageBitmap(thumbnail);
   // this code will get your capture image bitmap}

3 getImageUri

 public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);  // your capture image URL code
    return Uri.parse(path);

}

Используя этот код, ваш экран больше не будет оставаться в состоянии камеры, он завершится, и изображение будет загружено, а также вы получите URL-адрес изображения.

person Hardik Paranjape    schedule 19.09.2016

Bitmap mBitmap = BitmapFactory.decodeFile(imgPath);

передать путь к изображению, который вы создаете из URI.

person sanjay manvani    schedule 30.12.2013

Возможно, ваша активность перезагружается после завершения работы камеры, но ваш код не подготовлен к такой ситуации.

См. Android startCamera дает мне ноль Намерение и... уничтожает ли оно мою глобальную переменную?.

person Alex Cohn    schedule 30.12.2013

Я думаю, что onActivity вызывается, но не входит в условие if

Проверяйте только нулевое значение в условии if:

 if (data != null )
    switch (requestCode) {
    case 1:
        Log.i("StartUpActivity", "Photo Captured");
         Uri uri = data.getData();
         String imgPath = getRealPathFromURI(uri);
        bitmap = (Bitmap) data.getExtras().get("data");
        MediaStore.Images.Media.insertImage(getContentResolver(),
                bitmap, null, null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        img1.setImageBitmap(bitmap);
}
person sanjay manvani    schedule 30.12.2013

Откуда вы звоните startActivityForResult(intent, 1) и где переопределяете onActivityResult()?

Я имею в виду, что если вы вызываете startActivityForResult() из Fragment, тогда вы должны переопределить onActivityResult() в самом фрагменте, то же самое относится и к Activity.

person Ram Prakash Bhat    schedule 15.01.2016