Приложение разбилось после захвата изображения с помощью камеры Android

Я думал, что эта проблема уже задавалась так много раз, но, честно говоря, я все еще застрял. я следую решению в этом 14640678">Принудительное закрытие камеры в Samsung Galaxy S3 версии 4.1.1, но мое приложение по-прежнему принудительно закрывается. вот мой код:

Intent captureImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          startActivityForResult(intentAmbil,CAMERA_CAPTURE);

и onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode==RESULT_OK)
    {
        if(requestCode==CAMERA_CAPTURE)
        {
            Bitmap bitmap = null;
            picUri = data.getData();
            if(picUri!=null)
            {
                bitmap = (Bitmap) data.getExtras().get("data");
            }
            else
            {
                String[] projection = {
                        MediaStore.Images.Thumbnails.IMAGE_ID,
                        MediaStore.Images.Thumbnails.KIND,
                        MediaStore.Images.Thumbnails.DATA};
                String selection = MediaStore.Images.Thumbnails.KIND + "="+MediaStore.Images.Thumbnails.MICRO_KIND;
                String sort = MediaStore.Images.Thumbnails._ID + "DESC";
                Cursor myCursor =getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection,null, sort);
                long imageId = 01;
                long thumbnailImageId = 01;
                String thumbnailPath = "";
                try
                {
                    myCursor.moveToFirst();
                    imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));
                    thumbnailImageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID));
                    thumbnailPath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
                }
                finally
                {
                    myCursor.close();
                }
                //buat Cursor baru untuk mengambil gambar dengan resolusi lebih besar
                String[] largeFileProjection = {
                        MediaStore.Images.ImageColumns._ID,  
                           MediaStore.Images.ImageColumns.DATA};
                String largeFileSort = MediaStore.Images.ImageColumns._ID+"DESC";
                myCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort);
                String largeImagepath = "";
                try
                {
                    myCursor.moveToFirst();
                    largeImagepath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
                }
                finally
                {
                    myCursor.close();
                }
                Uri uriLargeImage = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(imageId));
                Uri uriThumbnailImage = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, String.valueOf(thumbnailImageId));
                picUri = uriLargeImage;
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), picUri);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Intent cropIntent= new Intent (this, Crop.class);
            cropIntent.putExtra("data", picUri.toString());
            cropIntent.putExtra("gambar", bitmap);
            cropIntent.putExtra("kode","kamera");
            startActivity(cropIntent);
        }

вот логкэт

        12-06 11:01:31.869: D/AndroidRuntime(13636): Shutting down VM
    12-06 11:01:31.879: W/dalvikvm(13636): threadid=1: thread exiting with uncaught exception (group=0x40b02930)
    12-06 11:01:31.909: E/AndroidRuntime(13636): FATAL EXCEPTION: main
    12-06 11:01:31.909: E/AndroidRuntime(13636): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.cobaandroid/com.example.cobaandroid.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3447)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3490)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread.access$1100(ActivityThread.java:153)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1295)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.os.Handler.dispatchMessage(Handler.java:99)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.os.Looper.loop(Looper.java:137)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread.main(ActivityThread.java:5260)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at java.lang.reflect.Method.invokeNative(Native Method)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at java.lang.reflect.Method.invoke(Method.java:511)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at dalvik.system.NativeStart.main(Native Method)
    12-06 11:01:31.909: E/AndroidRuntime(13636): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at com.example.cobaandroid.MainActivity.onActivityResult(MainActivity.java:153)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.Activity.dispatchActivityResult(Activity.java:5293)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3443)
    12-06 11:01:31.909: E/AndroidRuntime(13636):    ... 11 more

Мне очень нужна ваша помощь, ребята, спасибо...


person bohr    schedule 05.12.2013    source источник
comment
Какая строка кода вызывает сбой?   -  person i_am_jorf    schedule 05.12.2013
comment
спасибо за ваш ответ, я не могу получить logcat, потому что мое устройство не может использоваться в режиме отладки, всегда происходит сбой сразу после того, как я нажимаю кнопку сохранения после захвата изображения   -  person bohr    schedule 05.12.2013
comment
попробуй запустить с эмулятора   -  person Jeeter    schedule 05.12.2013
comment
я просто развертываю его в Samsung Note 10.1, и это работает, но когда я запускаю другое устройство, у меня возникает та же проблема в моем эмуляторе, я даже не могу использовать камеру.   -  person bohr    schedule 05.12.2013
comment
Без логарифма мы мало что можем сказать.   -  person Egor    schedule 05.12.2013
comment
я отредактировал свой пост с помощью logcat ..   -  person bohr    schedule 06.12.2013


Ответы (1)


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

imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));

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

Возможное решение этой проблемы:

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

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

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

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

person Gaurav Saluja    schedule 08.01.2016