试图从Android中的画廊或相机获取图像

我正在尝试在图库视图中从图库或相机加载图像的在线教程。图库部分工作正常,但相机部件强制关闭。从onactvitiyresult检索的数据显示为null。

代码:

package com.example.cameragallerypro; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { Uri selectedImageUri; String selectedPath; ImageView preview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b = (Button) findViewById(R.id.bGallery); Button bCam= (Button) findViewById(R.id.bCamera); preview = (ImageView) findViewById(R.id.preview); bCam.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, 100); } }); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub openGallery(10); } }); } public void openGallery(int req_code){ Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select file to upload "), req_code); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if(data.getData() != null){ selectedImageUri = data.getData(); }else{ Log.d("selectedPath1 : ","Came here its null !"); Toast.makeText(getApplicationContext(), "failed to get Image!", 500).show(); } if (requestCode == 100 && resultCode == RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); selectedPath = getPath(selectedImageUri); preview.setImageURI(selectedImageUri); Log.d("selectedPath1 : " ,selectedPath); } if (requestCode == 10) { selectedPath = getPath(selectedImageUri); preview.setImageURI(selectedImageUri); Log.d("selectedPath1 : " ,selectedPath); } } } public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } } 

logcat:

 09-17 10:09:30.132: E/AndroidRuntime(7300): FATAL EXCEPTION: main 09-17 10:09:30.132: E/AndroidRuntime(7300): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.cameragallerypro/com.example.cameragallerypro.MainActivity}: java.lang.NullPointerException 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread.access$2000(ActivityThread.java:117) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.os.Handler.dispatchMessage(Handler.java:99) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.os.Looper.loop(Looper.java:130) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread.main(ActivityThread.java:3689) 09-17 10:09:30.132: E/AndroidRuntime(7300): at java.lang.reflect.Method.invokeNative(Native Method) 09-17 10:09:30.132: E/AndroidRuntime(7300): at java.lang.reflect.Method.invoke(Method.java:507) 09-17 10:09:30.132: E/AndroidRuntime(7300): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 09-17 10:09:30.132: E/AndroidRuntime(7300): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 09-17 10:09:30.132: E/AndroidRuntime(7300): at dalvik.system.NativeStart.main(Native Method) 09-17 10:09:30.132: E/AndroidRuntime(7300): Caused by: java.lang.NullPointerException 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.content.ContentResolver.acquireProvider(ContentResolver.java:743) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.content.ContentResolver.query(ContentResolver.java:256) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.Activity.managedQuery(Activity.java:1550) 09-17 10:09:30.132: E/AndroidRuntime(7300): at com.example.cameragallerypro.MainActivity.getPath(MainActivity.java:104) 09-17 10:09:30.132: E/AndroidRuntime(7300): at com.example.cameragallerypro.MainActivity.onActivityResult(MainActivity.java:79) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.Activity.dispatchActivityResult(Activity.java:3908) 09-17 10:09:30.132: E/AndroidRuntime(7300): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 09-17 10:09:30.132: E/AndroidRuntime(7300): ... 11 more 

如何修改代码以使相机部件正常工作?

 bCam.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub from_camera(); } }); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub from_gallery(); } }); public void from_camera() { Intent cameraIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, 111); } public void from_gallery() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 222); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if (resultCode == RESULT_OK && requestCode == 111) { Bitmap photo = (Bitmap) data.getExtras().get("data"); preview.setImageBitmap(photo); } else if (resultCode == RESULT_OK && requestCode == 222) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); preview.setImageBitmap(BitmapFactory.decodeFile(picturePath)); super.onActivityResult(requestCode, resultCode, data); } 

尝试更换你的行:

 preview.setImageURI(selectedImageUri); 

与这一个:

 preview.setImageBitmap(photo); 

请看下面它可能对您有所帮助:

 public static String TEMP_PHOTO_FILE_NAME; private File mFileTemp; int ADD_IMAGE_CAPTURE = 5; public void takePictureFromCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { Uri mImageCaptureUri = null; String state = Environment.getExternalStorageState(); TEMP_PHOTO_FILE_NAME = "" + System.currentTimeMillis() + ".jpg"; if (Environment.MEDIA_MOUNTED.equals(state)) { mFileTemp = new File(Environment.getExternalStorageDirectory(), TEMP_PHOTO_FILE_NAME); } else { mFileTemp = new File(getFilesDir(), TEMP_PHOTO_FILE_NAME); } if (Environment.MEDIA_MOUNTED.equals(state)) { mImageCaptureUri = Uri.fromFile(mFileTemp); } else { /* * The solution is taken from here: * http://sofzh.miximages.com/java/, image   new Date().getTime()   .png"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); return imgUri; } public String getImagePath() { return imgPath; } public String getAbsolutePath(Uri uri) { String[] projection = { MediaStore.MediaColumns.DATA }; @SuppressWarnings("deprecation") Cursor cursor = managedQuery(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } else return null; } public Bitmap decodeFile(String path) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) scale *= 2; // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeFile(path, o2); } catch (Throwable e) { e.printStackTrace(); } return null; } public Bitmap decodeFile(Uri path) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(getAbsolutePath(path), o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) scale *= 2; // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeFile(getAbsolutePath(path), o2); } catch (Throwable e) { e.printStackTrace(); } return null; } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == GALLERY) { selectedPath = getAbsolutePath(data.getData()); preview.setImageBitmap(decodeFile(selectedPath)); } else if (requestCode == CAPTURE) { selectedPath = getImagePath(); preview.setImageBitmap(decodeFile(selectedPath)); } } } } 

在AndroidManifest.xml中添加此权限:

   

更改相机代码如下。

  if (requestCode == 100 && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); preview.setImageBitmap(photo); 

}

我真的建议你使用图书馆为你做艰苦的工作。 你必须看看这个库 ,从画廊或相机中选择一个图像要容易得多。 使用上面的库,将显示一个对话框,用户可以选择是否要从图库或相机中获取图像。

只需调用以显示对话框:

 PickImageDialog.on(MainActivity.this, new PickSetup()); 

让你的活动实现这个:

 public class YourActivity implements IPickResult.IPickResultBitmap 

然后覆盖此方法:

 @Override public void onPickImageResult(Bitmap photo) { preview.setImageBitmap(photo); }