2013-07-04 2 views
6

В моем приложении есть возможность захвата изображения с камеры. Но есть проблема с получением изображения с камеры. Когда я использую ACTION_IMAGE_CAPTURE этого возвращать нуль data.Please помочь мне получить путь изображения от намерения камерыПолучить путь изображения от намерения камеры

Журнал ошибок:

07-04 11:22:36.902: E/AndroidRuntime(8329): FATAL EXCEPTION: main 
07-04 11:22:36.902: E/AndroidRuntime(8329): java.lang.RuntimeException: Unable to resume activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2836) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.access$1600(ActivityThread.java:117) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.os.Looper.loop(Looper.java:130) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at dalvik.system.NativeStart.main(Native Method) 
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2111) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  ... 13 more 
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.NullPointerException 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at com.pausefablogin.AddPOI.onActivityResult(AddPOI.java:281) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
07-04 11:22:36.902: E/AndroidRuntime(8329):  ... 14 more 

Заранее спасибо

+0

http://stackoverflow.com/questions/17426178/tell-the-camera-intent-to-save-the-taken-image/17426328#17426328. – Nirmal

ответ

3

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

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      videoView.setVisibility(View.INVISIBLE); 
      imageView.setVisibility(View.VISIBLE); 
      imageView.setImageBitmap(photo); 
     } 
    } 
9

попробовать это один

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

и называем это

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent resultData) { 
    super.onActivityResult(requestCode, resultCode, resultData); 

     if (resultData != null) { 

     String[] projection = { MediaStore.Images.Media.DATA }; 
       Cursor cursor = managedQuery(
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
         projection, null, null, null); 
       int column_index_data = cursor 
         .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
       cursor.moveToLast(); 

       String imagePath = cursor.getString(column_index_data); 
       Bitmap bitmapImage = BitmapFactory.decodeFile(imagePath); 
       imageView.setImageBitmap(bitmapImage); 

      } 

и использовать prrmission, что вы хотите

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

вы можете использовать следующие шаги:

// create a global variable 
File destination; 
openCameraBtn.setOnClickListener(new OnClickListener() 
{ 

      @Override 
      public void onClick(View v) { 
       destination = new File(Environment.getExternalStorageDirectory(),"image.jpg"); 

       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination)); 
       startActivityForResult(intent, CAMERA_PICTURE); 

      } 
     }); 


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


    if(requestCode == CAMERA_PICTURE && resultCode == Activity.RESULT_OK) 
      { 
      try{ 
      FileInputStream in = new FileInputStream(destination); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 10; //Downsample 10x 
      Log.d("PP", " bitmap factory=========="+options); 
      Bitmap user_picture_bmp = BitmapFactory.decodeStream(in, null, options); 
     userImage.setImageBitmap(user_picture_bmp); 
     } catch (Exception e) 
      { e.printStackTrace(); 
     } 

    } 

пожалуйста, заявите разрешение и функции в вашем файле манифеста.

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

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

http://developer.android.com/guide/topics/media/camera.html

я надеюсь, что вы успеха.

+0

что я должен добавить в CAMERA_PICTURE. могу ли я добавить любое число или что-то конкретное –

+0

вы даете разрешение в файле манифеста. – Yogendra

+0

Этот код дает исключение в destination = new File (Environment.getExternalStorageDirectory(), "image.jpg"); –

1
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC"); 
     if(cursor != null && cursor.moveToFirst()) 
     { 
      do { 
       Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA))); 
       String photoPath = uri.toString(); 
      }while(cursor.moveToNext()); 


      cursor.close(); 
     } 

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

5

У меня был такая же проблема, и следующие работал для меня:

@Override 
public void onClick(View v) { 
     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(Intent.createChooser(intent, "Select Picture"), CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
       } 
     }); 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
//super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { 
     final ContentResolver cr = getContentResolver(); 
     final String[] p1 = new String[] { 
      MediaStore.Images.ImageColumns._ID, 
      MediaStore.Images.ImageColumns.DATE_TAKEN 
       }; 
    Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC"); 
     if (c1.moveToFirst()) { 
     String uristringpic = "content://media/external/images/media/" +c1.getInt(0); 
     Uri uri = Uri.parse(uristringpic); 
      try { 
       Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri); 

Надеется, что это помогает, как я знаю, как это разочарование.

2

Возможно, вы используете устройство Samsung. Я считаю, что это ошибка, которая возникает в этих устройствах. Вы должны получить URI иначе. Сделайте это:

/** 
    * (This is a variable instance) Contains the path and file name where you want to save the image. 
    * Mainly used to start Intent.Action_View with this URI. (GalleryApp) 
    */ 
private Uri uriImage= null; 

public void onClickCamera(View v){ 
    // Cria uma intent para capturar uma imagem e retorna o controle para quem o chamou (NAO PRECISA DECLARAR PERMISSAO NO MANIFESTO PARA ACESSAR A CAMERA POIS O FAZEMOS VIA INTENT). 
    // Creates an intent to capture an image and returns control to the caller 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Cria um arquivo para salvar a imagem. 
    // Creates an file to save the image. 
    uriImage = ProcessaImagens.getOutputMediaFileUri(ProcessaImagens.MEDIA_TYPE_IMAGE, getActivity().getApplicationContext()); 
    // Intent to pass a URI object containing the path and file name where you want to save the image. We'll get through the data parameter of the method onActivityResult(). 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImagem); 
    // Starts the intent to image capture and waits the result. 
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

ProcessaImagens класс является классом, который я закодированы, и я делюсь со всеми. Может использовать этот класс для облегчения. Он имеет очень хороший способ сжать изображение, если вы хотите сохранить изображения в базе данных. В своем методе onActivityResult() сделать это:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // If finished activity on startForActivityResult. 
    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      String imagePath = uriImage.getPath(); 
      // I will compress the imagem. Read the javadoc from method and you'll see which it returns both bitmap and array bytes. 
      List<Object> imageCompact = ProcessaImagens.compactarImagem(uriImagem.getPath()); 
      Bitmap imageBitmap = (Bitmap) imageCompact.get(0); 
      byte[] imageBytes = (byte[]) imageCompact.get(1); 

     } 
    } 
    // If canceled activity on startForActivityResult. 
    else if (resultCode == Activity.RESULT_CANCELED) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      // User canceled the image capture. 
      Log.d(getTag(), "Image capture canceled!"); 
     } 
    } 
    // If an error occurred in the activity on startForActivityResult. 
    else { 
     // Failed the image capture, alert the user. 
     Toast.makeText(getActivity().getApplicationContext(), "FAILED! The image capture failed!", Toast.LENGTH_LONG).show(); 
     Log.e(getTag(), "FAILED! The image capture failed!"); 
    } 
} 

Обратите внимание, что я использовал getActivity().getApplicationContext(), потому что я получаю контекст из фрагмента, а не от деятельности.Я считаю, что с помощью этого метода вы можете иметь то, что хотите. Просто внесите небольшие изменения, как форма для получения контекста.

+1

Предпочтительно, чтобы вы переводили и добавляли ответ здесь, как только ссылки только ответы здесь неприемлемы. – Math

+0

Хорошо, я сделаю это. –

+0

@Math Я отредактировал свой ответ. –

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