2012-04-05 1 views
3

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

Что может быть причиной этого? может ли кто-нибудь помочь мне определить возможные ошибки?

Ниже мой код:

**public void onCreate**(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    **Intent** intent = new **Intent**("android.media.action.IMAGE_CAPTURE"); 
    try { 
     fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    } 

    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    intent.putExtra(**MediaStore**.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

@Override 
**protected void onActivityResult**(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 
      StoreImage(this, data.getData(), 
      mediaFile); 
      finish(); 
     } 

     else if (resultCode == RESULT_CANCELED) { 
      // User cancelled the image capture 
     } 

     else { 
      finish(); 
      try { 
      } 

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

} 

Стек след ниже ::

04-05 23:55:40.369: E/AndroidRuntime(534): FATAL EXCEPTION: main 
04-05 23:55:40.369: E/AndroidRuntime(534): java.lang.RuntimeException: Unable to start activity ComponentInfo{camera.android/camera.android.CameraActivity}: java.lang.NullPointerException: file 
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 

04-05 23:55:40.369: E/AndroidRuntime(534): Caused by: java.lang.NullPointerException: file 
04-05 23:55:40.369: E/AndroidRuntime(534): at android.net.Uri.fromFile(Uri.java:441) 
04-05 23:55:40.369: E/AndroidRuntime(534): at camera.android.CameraActivity.getOutputMediaFileUri(CameraActivity.java:72) 
04-05 23:55:40.369: E/AndroidRuntime(534): at camera.android.CameraActivity.onCreate(CameraActivity.java:34) 
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.Activity.performCreate(Activity.java:4465) 
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
+1

где трассировка стека? –

+0

было бы лучше, если вы можете опубликовать свой журнал сбоев. –

+0

см. Мой ответ здесь, если ниже решение не для вас: http://stackoverflow.com/questions/31334378/null-pointer-exception-on-file-uri/43228221#43228221 – temirbek

ответ

4

проверить ли вы ниже разрешение в файле манифеста ::

<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 

также в

fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

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

+0

В функции getOutputMediaFileUri (MEDIA_TYPE_IMAGE), я определили путь, в котором файл сохраняется, файл f = новый файл (Environment.getExternalStorageDirectory(), «IMG_» + timeStamp + «.jpg») –

+0

проверить, является ли fileUri нулевым или нет. а также то, что StoreImage (это, data.getData(), mediaFile); –

+0

В чем проблема –

4

Interchange эта линия,

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
       if (resultCode == RESULT_OK) { 

в

if (resultCode == RESULT_OK) { 
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 

Сначала проверьте, успешно ли выполнена детская работа или нет. добавлено

1

"@ Агарвал: на вызов onActivityResult"

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       StoreImage(this, data.getData(), mediaFile); 
       finish(); 

      } else if (resultCode == RESULT_CANCELED) { 
       // User cancelled the image capture 
      } else { 
       finish(); 
       try { 

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

     } 

    } 

«Если результат успеха, то данные из стажера хранится п файл, который создается и сохраняется в формате JPEG»

public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
0

попробовать код ниже,

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

    File file=getOutputMediaFile(1); 
    picUri = Uri.fromFile(file); // create 
    i.putExtra(MediaStore.EXTRA_OUTPUT,picUri); // set the image file 

    startActivityForResult(i, CAPTURE_IMAGE); 

где getOutputMediaFile (INT) будет,

/** Create a File for saving an image */ 
private File getOutputMediaFile(int type){ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES), "MyApplication"); 

    /**Create the storage directory if it does not exist*/ 
    if (! mediaStorageDir.exists()){ 
     if (! mediaStorageDir.mkdirs()){ 
      return null; 
     } 
    } 

    /**Create a media file name*/ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == 1){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
     "IMG_"+ timeStamp + ".png"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

и, наконец,

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK) { 
     Intent i; 
     switch (requestCode) { 
     case CAPTURE_IMAGE: 
      //THIS IS YOUR Uri 
      Uri uri=picUri; 
      break; 
     } 
    } 
} 

ура .... ....

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