намерение камеры не возвращается к фрагменту, не вызывающему результат действия

Я пытаюсь открыть камеру, сделать снимок, сохранить в массиве байтов, а затем отобразить изображение на фрагменте.

Камера открывается и делает снимок, но когда вы нажимаете галочку, она снова показывает камеру.

Я проверил результат активности, и он не вызывается. У меня есть все правильные настройки разрешений.

Я пробовал другие ответы здесь, но безуспешно.

Вот как я открываю камеру во фрагменте:

@AfterPermissionGranted(REQUEST_PERMISSIONS_ACTIVITY_REQUEST_CODE)
private void openCamera(){
    // start main activity
    String [] perms = {Manifest.permission.CAMERA};
    if (EasyPermissions.hasPermissions(getActivity(), perms)){

        // Start the Camera
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

    } else {
        Log.d("Chex ", "Check did not find permissions starting dialog to explain use of user permissions");
        EasyPermissions.requestPermissions(this, "This app needs camera permissions to store reciepts", REQUEST_PERMISSIONS_ACTIVITY_REQUEST_CODE, perms);
    }
}

Это мой onActivityResult во фрагменте:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Chex ", "On activity results called " + resultCode);

    if (resultCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE){
        openCamera();
    } else{
        openCamera();
    }

    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            Bitmap bmp = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            transactionImageLocationByteArray = stream.toByteArray();

            // Load the image into the imageview
            Glide.with(getActivity()).asBitmap().load(transactionImageLocationByteArray).into(addTransactionCameraButon);

        } else if (resultCode == Activity.RESULT_CANCELED) {
            Toast.makeText(getActivity(), "Image Capture Cancelled", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getActivity(), "Image Capture Failed", Toast.LENGTH_SHORT).show();
        }
    }
} 

EDIT:
Добавление по запросуPermission:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    Log.d("Chex ", "Permission on request result came back with " + grantResults);
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

РЕДАКТИРОВАТЬ 2:
Добавлено onActivityResult в основное действие (основное действие для фрагмента), но без изменений:

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

person Nicholas Muir    schedule 20.04.2018    source источник
comment
Пожалуйста, покажите метод onRequestPermissionsResult в вашем фрагменте.   -  person Son Truong    schedule 20.04.2018
comment
Ок спасибо покажу. Это для простых разрешений   -  person Nicholas Muir    schedule 20.04.2018
comment
Просто чтобы убедиться, что вы переопределили onActivityResult и во фрагменте, и в действии, и в действии у вас есть вызов super, но не во фрагменте, верно?   -  person Suleyman    schedule 20.04.2018
comment
Отредактировал его, чтобы добавить   -  person Nicholas Muir    schedule 20.04.2018
comment
О, вы должны сделать это и в действии?   -  person Nicholas Muir    schedule 20.04.2018
comment
Я добавил это в основное действие, но это ничего не изменило: @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { super.onActivityResult (requestCode, resultCode, data); }   -  person Nicholas Muir    schedule 20.04.2018
comment
Я не смог понять причину, по которой onActivityResult не вызывается, но, пожалуйста, проверьте stackoverflow.com/questions/8839434/, ответ, данный jegumi, может работать.   -  person Sachin Varma    schedule 20.04.2018


Ответы (3)


Если вы вызываете метод openCamera во фрагменте, вам нужно проверить это

onActivityResult не вызывается во фрагменте

person Ferhat Ergün    schedule 20.04.2018
comment
Привет, спасибо, я уже прошел по этой ссылке, и ничего не работает - person Nicholas Muir; 20.04.2018
comment
Вы пытались добавить в свою активность хоста? @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } - person Ferhat Ergün; 20.04.2018
comment
Это не изменилось - person Nicholas Muir; 20.04.2018
comment
ты делаешь что-то не так имхо. Убедитесь, что вы вызываете метод startActivityForResult из метода Fragment this.startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); - person Ferhat Ergün; 20.04.2018
comment
Это тоже не повлияло - person Nicholas Muir; 20.04.2018

вам нужно изменить onActivityResult() :

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

        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            // Do something after user returned from app settings screen
            openCamera();
        } else if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

            if (resultCode == Activity.RESULT_OK) {
                Bitmap bmp = (Bitmap) data.getExtras().get("data");
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
                transactionImageLocationByteArray = stream.toByteArray();

                // Load the image into the imageview
                Glide.with(getActivity()).asBitmap().load(transactionImageLocationByteArray).into(addTransactionCameraButon);

            } else if (resultCode == Activity.RESULT_CANCELED) {
                Toast.makeText(getActivity(), "Image Capture Cancelled", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getActivity(), "Image Capture Failed", Toast.LENGTH_SHORT).show();
            }
        }
    }

Изменить: добавьте приведенный ниже код в метод onActivityResult() вашей деятельности.

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.yourFragmentId);
        fragment.onActivityResult(requestCode, resultCode, data);

}
person Hitesh Sarsava    schedule 20.04.2018
comment
Привет, спасибо, не могли бы вы объяснить больше, мне интересно, какие изменения вы имеете в виду. Я вижу, вы добавляете его в if else, но чем это отличается от наличия второго оператора if? Или я что-то упускаю, спасибо. О том, что активность вообще не вызывается, посмотрите, как у меня есть оператор журнала перед чем-либо в результате активности, который должен проверить, вызывается ли он - person Nicholas Muir; 20.04.2018
comment
прежде всего вы проверяете код результата вместо проверки кода запроса в resultCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE, поэтому необходимо изменить это - person Hitesh Sarsava; 20.04.2018
comment
видите, я отредактировал свой ответ. в этом случае вам нужно найти фрагмент и вызвать метод фрагмента onActivityResult() - person Hitesh Sarsava; 20.04.2018

Удалить super из onActivityResult().

Удалить эту строку super.onActivityResult(requestCode, resultCode, data);

super унаследует родительский класс onActivityResult

person Senthil JS    schedule 20.04.2018
comment
Привет, спасибо, я сделал это, и он просто перезапускает основное действие. - person Nicholas Muir; 20.04.2018
comment
удалить @Override также из onActivityResult() - person Senthil JS; 20.04.2018
comment
я так и сделал без изменений - person Nicholas Muir; 20.04.2018
comment
Попробуйте это на thecheesefactory.com/blog/ - person Senthil JS; 20.04.2018
comment
Начните так getActivity().startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); и получите результат в родительской активности, а из фрагмента родительской активности вызовите onActivityResult(). Посмотрите на эту ссылку codexpedia.com/android/ - person Senthil JS; 20.04.2018
comment
Это начинает помогать, теперь он возвращается к фрагменту, но все еще не вызывает результат активности. - person Nicholas Muir; 20.04.2018
comment
Затем создайте статическую функцию внутри вашего фрагмента и вызовите эту функцию из родительской активности onActivityResult(). - person Senthil JS; 20.04.2018