Get image path from camera target

My application has the ability to capture images from the camera. But there is a problem with receiving images from the camera. When I use ACTION_IMAGE_CAPTURE , it returns null data. Please help me get the image path from camera intent

Error Log:

 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 

Thank you in advance

+6
source share
7 answers

try this one

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

and name it

 @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 ); } 

and use the access you want

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

I had the same problem and for me this worked:

 @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); 

Hope this helps, as I know how frustrating it is.

+5
source

If you successfully implement the code, you will get an image to be captured, and then manually you can save it for future use.

 @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); } } 
+3
source

You can use the following steps:

 // 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(); } } 

please declare permission and function in your manifest file.

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

If you want more detail, you can use the following link:

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

I hope you succeed.

+3
source

You are probably using a Samsung device. I believe that this is an error that occurs in these devices. You must get the URI differently. Do it:

 /** * (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 ); } 

The ProcessaImagens class is the class that I encoded, and I am sharing with everyone. May use this class for relief. It has a very good way to compress an image if you want to save the images in a database. In your onActivityResult() method, do the following:

 @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!" ); } } 

Note that I used getActivity().getApplicationContext() , because I get the context from the fragment, not from Activity. I believe that with this method you can have what you want. Just make small changes to how the form gets context.

+2
source
  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(); } 

when the loop performing the last call gives the path to the image that was last recorded.

+1
source

Make sure you put this tag in the manifest file: <uses-feature android:name="android.hardware.camera" />

And this can help you: fooobar.com/questions/64769 / ...

-1
source

Source: https://habr.com/ru/post/948673/


All Articles