2013-07-29 1 views
0

Я пытаюсь запустить операцию с камерой, а затем захватить фотографию, когда пользователь сохранит ее и вернется в приложение. Это отлично работает на моем телефоне под управлением Android 2.2, но я получаю исключение NullPointerException на моем планшете с версией 4.1.2 или что-то в этом роде.Изображение не отображается при использовании приложения на планшете

Я вижу, что приложение получает NullPointerException в «onActivityResult», когда я пытаюсь сделать растровое изображение из «данных», который передается (явно нет данных становятся прошли):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    pauseTime = System.currentTimeMillis(); 
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime); 
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " RESULT_OK is: " + RESULT_OK); 

    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 

     try { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
     } catch (Exception e) { 
      // Data is null getting sent back 
      e.printStackTrace(); 
     } 

Погрешности в logcat выглядит так:

07-29 17:16:50.795: W/System.err(19517): java.lang.NullPointerException 
07-29 17:16:50.795: W/System.err(19517): at  com.android.thoughtfi.UsersThoughts.onActivityResult(UsersThoughts.java:163) 
07-29 17:16:50.795: W/System.err(19517): at android.app.Activity.dispatchActivityResult(Activity.java:5391) 
07-29 17:16:50.795: W/System.err(19517): at android.app.ActivityThread.deliverResults(ActivityThread.java:3215) 
07-29 17:16:50.795: W/System.err(19517): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3262) 
07-29 17:16:50.795: W/System.err(19517): at android.app.ActivityThread.access$1200(ActivityThread.java:140) 
07-29 17:16:50.795: W/System.err(19517): at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286) 
07-29 17:16:50.800: W/System.err(19517): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-29 17:16:50.800: W/System.err(19517): at android.os.Looper.loop(Looper.java:137) 
07-29 17:16:50.800: W/System.err(19517): at android.app.ActivityThread.main(ActivityThread.java:4947) 
07-29 17:16:50.800: W/System.err(19517): at java.lang.reflect.Method.invokeNative(Native Method) 

Почему нет данных, возвращающихся к onactivityresult приложения?

EDIT (для дополнительной информации, здесь photoButton):

photoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // possible option 
      String fileName = "temp.jpg"; 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, fileName); 
      mCapturedImageURI = getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
      startActivityForResult(intent, CAMERA_REQUEST); 
     } 
    }); 

EDIT Это, кажется, работает нормально, но я все еще получаю фото отображается в ландшафтном режиме, независимо от того, как я беру его на таблетка:

onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    pauseTime = System.currentTimeMillis(); 
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime); 
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " "); 

    Log.i(TAG, "The intent mCapturedImageURI was: " + mCapturedImageURI); 

    Bitmap photo = null; 
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 
     if(data != null){ 
      photo = (Bitmap) data.getExtras().get("data"); 
     } else { 
       try { 
        photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mCapturedImageURI); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }    
     } 

     imageView.setImageBitmap(photo); 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(mCapturedImageURI, projection, null, 
       null, null); 
     int column_index_data = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     capturedImageFilePath = cursor.getString(column_index_data); 

Фото Баттон:

photoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // possible option 
      String fileName = "temp.jpg"; 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, fileName); 
      mCapturedImageURI = getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
      startActivityForResult(intent, CAMERA_REQUEST); 
     } 
    }); 
+0

Где находится строка 163 вашего файла UsersThoughts.java? – Brtle

+0

Здесь выбрано исключение: Bitmap photo = (Bitmap).. GetExtras() получить ("данные"); – Stagleton

+0

Поскольку у вас есть блок catch try, я не вижу, как код, который вы показываете, приводит к сбою приложения. Ваш вопрос, почему вы получаете NPE? –

ответ

0

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

Соответствующий фрагмент кода:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, "Image saved to: " + data.getData(), Toast.LENGTH_LONG).show(); 
     } else { 
      // whatever 
     } 
    } 

EDIT: от MediaStore.ACTION_IMAGE_CAPTURE description

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

Вызывающий может передать дополнительный EXTRA_OUTPUT для контроля, где будет изображено это изображение . Если EXTRA_OUTPUT отсутствует, тогда небольшое размерное изображение возвращается в качестве объекта Bitmap в дополнительное поле. Это полезно для приложений, которым требуется только небольшое изображение. Если присутствует EXTRA_OUTPUT, то полноразмерное изображение будет записано в значение Uri EXTRA_OUTPUT.

Если я понимаю, деятельность Камера возвращается либо:

  • Ури полного изображения, если EXTRA_OUTPUT был указан
  • или миниатюру в getExtras() получить (». data "), если EXTRA_OUTPUT не указан

Вы указали параметр EXTRA_OUTPUT в запуске камеры Intent?

+0

Нет, я не указал его. Возможно, в более поздних версиях миниатюра не будет автоматически возвращена, поэтому следует использовать EXTRA_OUTPUT. Я тоже попробую это сделать и посмотреть, как это работает. – Stagleton

+0

На самом деле у меня был параметр EXTRA_OUTPUT в намерении. Спасибо за помощь, это привело к хорошему виду ответа – Stagleton

Смежные вопросы