Сбой приложения при нажатии кнопки «Назад» в намерении камеры Android - PullRequest
2 голосов
/ 08 июля 2011

У меня проблема с использованием камеры в моем приложении для Android

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

Нет проблем при вызове камеры и размещении изображения в форме

моя проблема: в приложении камеры, если я нажму кнопку возврата (обратно в форму), мое приложение упадет .

почему

это код на моей кнопке, который вызывает камеру

btn_takepic.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {            
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    }
});

это мой onActivityResult

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final EditText et_foto = (EditText) findViewById(R.id.et_foto);
    if(requestCode == CAMERA_PIC_REQUEST) {          
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  
        ImageView image = (ImageView) findViewById(R.id.imv_foto);  
        image.setImageBitmap(thumbnail);
        //toastkeun(data.getExtras().get("data").toString());
    }

    super.onActivityResult(requestCode, resultCode, data);
}

я тестирую на реальном устройстве это мой logCat

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     ... 11 more
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):     ... 11 more

из этой строки, я думаю, в этом проблема ...

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException

нет результата, не так ли? как это исправить?

спасибо

cmiiw

Ответы [ 5 ]

4 голосов
/ 08 июля 2011

Исключение NullPointerException вызвано тем, что ваш код предполагает, что data.getExtras (). Get ("data") что-то вернет.Это совершенно недокументированный параметр, и на многих (большинстве) устройствах он возвращает ноль.

Если, как кажется, вы пытаетесь получить миниатюру, вы можете попробовать что-то вроде этого, которое пытается оба известные (мне, во всяком случае) способы извлечения миниатюры из результатов Camera Intent.

Bitmap thumb;   
if (data.getData() != null) {
    try {
        Uri uri = data.getData();
        thumb = Images.Thumbnails.getThumbnail(getContentResolver(), Long.parseLong(uri.getLastPathSegment()), Images.Thumbnails.MICRO_KIND, null);
        } catch (Exception typeNotSupported) {

        }
    }
    if (thumb == null) {
        thumb = (Bitmap) data.getExtras().get("data");
    }
}

Кстати, я думаю, что есть еще одна ошибка - ваш onActivityResult должен также проверить, что resultCode в порядке - если пользователь отменяетс камеры я верю, что onActivityResult все равно будет вызываться.

Надеюсь, это полезно.

3 голосов
/ 08 июля 2011

Я не думаю, что это исходит из вашего приложения.Вы можете попытаться заключить весь код результата onActivity в блок try / catch.я думаю, что вы испытываете ошибку камеры на некоторых телефонах.также попробуйте попробовать разные комбинации дополнений, которые вы отправляете по намерению startActivityForResult.

Также всегда проверяйте код результата, прежде чем что-либо делать.Вы не хотите делать тот же код, если результат отменен (Activity.RESULT_CANCELED) или хорошо (Activity.RESULT_OK)

, также есть ошибка, когда результат не входит в EXTRA_OUTPUT (я думаю, что этобыл назван так), но вместо этого он входит как Uri в intent.getData ().дополнительный вывод - вы указываете путь для сохранения файла, а возвращаемое значение uri - это обычно изображение, сохраненное в расположении камеры по умолчанию.немного по-другому, как вы увидите.

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

2 голосов
/ 12 декабря 2013

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode != RESULT_OK) 
    {
    //Here you can handle,do anything you want
    }
//other code
}
0 голосов
/ 08 ноября 2018

Я думаю, что это можно решить простым трюком

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)   {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==0)
    {
        return;
    }
0 голосов
/ 02 апреля 2014

Вы говорите о видео на YouTube, я знаю, у меня была та же ошибка.

protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try 
    {    
            Button btn = (Button) findViewById(R.id.takePhoto);
            btn.setOnClickListener(new OnClickListener() 
            {

                @Override
                public void onClick(View v) 
                {
                       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                       startActivityForResult(intent, 0);
                }

             });
            iv = (ImageView) findViewById(R.id.imageView);

    } 
     catch (Exception e) 
    {
         e.printStackTrace();
    }

}
...