MediaStore.ACTION_IMAGE_CAPTURE на Android-Go - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть это приложение, которое работало отлично, пока приложение для бизнеса не купило всех Huawei Y5lite с android go , затем приложение начало ломаться во время съемки изображений.Я пытался взломать это последние четыре дня, но безуспешно.Аварии случайные и не следуют какой-либо схеме, это означает, что приложение может сделать несколько снимков без сбоев, а затем в какой-то момент происходит сбой, что заставляет меня думать, что моя активность прерывается, когда на заднем плане и в камере на переднем плане, и такonActivityResult не удается.Я попытался сохранить URL-адрес изображения onSaveInstanceState и получить его onCreate, но не решил его ниже. Ниже приведен мой соответствующий код и ошибки

private void launchCamera() {


        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

            File photoFile = null;
            try {
                photoFile = BitmapUtils.createTempImageFile(this);
            } catch (IOException ex) {

                ex.printStackTrace();
            }
            if (photoFile != null) {


                mTempPhotoPath = photoFile.getAbsolutePath();

                // Get the content URI for the image file
                Uri photoURI = FileProvider.getUriForFile(this,
                        FILE_PROVIDER_AUTHORITY,
                        photoFile);

                // Add the URI so the camera can store the image
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

                // Launch the camera activity
                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
            }
        }
    }

//saving the filename incase activity is killed
@Override
    public void onSaveInstanceState(Bundle bundle)
    {
        super.onSaveInstanceState(bundle);
        bundle.putString("fileName", mTempPhotoPath);
    }
//retrieving file name onCreate
if (savedInstanceState != null){
            mTempPhotoPath = savedInstanceState.getString("fileName");}

// processing the image

private void processAndSetImage() {


    switch (imageTaken) {
        case "imageOne":
//I did the try-catch to see if I can isolate the issue but still crashes
                try{
                mAddImageOne.setVisibility(View.GONE);
                mResultsBitmap = BitmapUtils.resamplePic(this, mTempPhotoPath);
                mOneView.setVisibility(View.VISIBLE);
                mOneView.setImageBitmap(mResultsBitmap);
                findViewById(R.id.front_image_text).setVisibility(View.VISIBLE);
                findViewById(R.id.save_cancel).setVisibility(View.VISIBLE);
                }catch (Exception e){
                    Toast toast = Toast.makeText(getApplicationContext(), "Please try take the picture again",
                            Toast.LENGTH_LONG);

                    toast.setGravity(Gravity.BOTTOM, 0, 1100);
                    toast.show();
                }
                break;


            case "imageTwo":
                try{
                mAddImageTwo.setVisibility(View.GONE);
                mTwoView.setImageBitmap(mResultsBitmap);
                mResultsBitmap = BitmapUtils.resamplePic(this, mTempPhotoPath);
            findViewById(R.id.front_image_label_text).setVisibility(View.VISIBLE);
            findViewById(R.id.save_cancel).setVisibility(View.VISIBLE);
            mTwoView.setVisibility(View.VISIBLE);
            }catch (Exception e){
                Toast toast = Toast.makeText(getApplicationContext(), "Please try take the picture again",
                        Toast.LENGTH_LONG);

                toast.setGravity(Gravity.BOTTOM, 0, 1100);
                toast.show();
            }


    break;
}

Ниже приведена ошибка, которую я получаю, когда происходит сбой.(Иногда фотографирование и обработка выполняются хорошо, иногда происходит сбой)

02-05 13: 53: 22.139 23081-23086 / com.avigail.tuborg I / zygote: Выполнить сбор кеша частичного кода, code =25 КБ, данные = 30 КБ 02-05 13: 53: 22.140 23081-23086 / com.avigail.tuborg I / zygote: после сбора кэша кода, код = 25 КБ, данные = 30 КБ 02-05 13: 53: 22.141 23081-23086 /com.avigail.tuborg I / zygote: увеличение емкости кэша кода до 128 КБ 02-05 13: 53: 22.277 23081-23081 / com.avigail.tuborg D / AndroidRuntime: завершение работы VM 02-05 13: 53: 22.284 23081-23081/com.avigail.tuborg E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.avigail.tuborg, PID: 23081 java.lang.RuntimeException: Невозможно возобновить активность {com.avigail.tuborg / com.avigail.kaskazi.activities.StockistActivity}: java.lang.RuntimeException: сбой при доставке результата ResultInfo {who = null, request = 1, result = -1, data = null} в действие {com.avigail.tuborg / com.avigail.kaskazi.activities.StockistActivity}: java.lang.NullPointerException: попытка вызватьвиртуальный метод 'int java.lang.String.hashCode ()' для ссылки на пустой объект в android.app.ActivityThread.performResumeActivity (ActivityThread.java:3844) в android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3884) вandroid.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3053) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1777) в android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:166) на android.app.ActivityThread.main (ActivityThread.java:6861) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:450) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936). Вызывается: java.lang.RuntimeException: ошибка при доставке результата ResultInfo {who = null, request = 1, result = -1, data = null} в действие {com.avigail.tuborg / com.avigail.kaskazi.activities.StockistActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод int java.lang.String.hashCode () для нулевой ссылки на объект в android.app.ActivityThread.deliverResults (ActivityThread.java:4564) в android.app.ActivityThread.performResumeActivity.(ActivityThread.java:3816) в android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3884) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3053) в android.app.ActivityThread.-wrap11 (неизвестный источник:0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1777) в android.os.Handler.dispatchMessage (Handler.java:106) в android.os.Looper.loop (Looper.java:166) вandroid.app.ActivityThread.main (ActivityThread.java:6861) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:450)at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936) Причина: java.lang.NullPointerException: Попытка вызвать виртуальный метод int java.lang.String.hashCode () для ссылки на пустой объектв com.avigail.kaskazi.activities.StockistActivity.processAndSetImage(StockistActivity.java:392) в com.avigail.kaskazi.activities.StockistActivity.onActivityResult(StockistActivity.java:377) в android.app.Activity.dispatchActivityResult (Activity.java:7393) в android.app.ActivityThread.deliverResults (ActivityThread.java:4560) в android.app.ActivityThread.performResumeActivity (ActivityThread.java): 3816) в android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3884) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3053) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1777) в android.os.Handler.dispatchMessage (Handler.java:106) в android.os.Looper.loop (Looper.java:166) в android.app.ActivityThread.main (ActivityThread.java:6861) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:450) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Я буду очень признателен за вашу помощь PS: я видел различные вопросы, касающиеся этой проблемы, но ни один из ответов не работал, включая проверку, если данныеnull (мои данные равны null, потому что я добавляю дополнительную опцию), сохраняя URL-адрес изображения наSaveInstanceState, проверяя, возвращает ли результат intentfor результат ok

1 Ответ

0 голосов
/ 07 февраля 2019

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

Я сохранял imageUrl, хорошо, но отсутствовал в переменной в переключателе, который былпроверка, какое изображение было захвачено

switch (imageTaken) {
        case "imageOne":

Итак, добавление переменной onSaveInstanceState и соответствующий вызов ее onCreate решило проблему

@Override
    public void onSaveInstanceState(Bundle bundle)
    {
        super.onSaveInstanceState(bundle);
        bundle.putString("fileName", mTempPhotoPath);
        bundle.putString("imageTaken", imageTaken);
    }

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

Преимущество состоит в том, что вся проблема помогла оптимизировать размеры моего изображения и использование памяти при обработке растрового изображения

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