问题
I have two image buttons,for camera and gallery . If you select "camera" you can capture a photo from camera and then that photo has to be displayed in another activity in image view. If you select "gallery" then you have to select a photo from gallery and then that photo has to be display it in another activity . My code for gallery works fine . I created two others activities(with the same layout), one for gallery and the other for camera. But the code for camera doesn't work . Here is my code : MainActivity :
private static final int REQUEST_CAMERA = 1;
private static int SELECT_FILE = 1;
ImageButton take_photo = (ImageButton) findViewById(R.id.cameraButton);
ImageButton get_photo = (ImageButton) findViewById(R.id.galleryButton);
if (take_photo != null) {
take_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
}
});
}
//to get the photo from gallery
if (get_photo != null) {
get_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, SELECT_FILE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_FILE) {
selectedImageURI = data.getData();
File imageFile = new File(getRealPathFromURI(selectedImageURI));
Intent intent = new Intent(this, ShowPhotoActivity.class);
intent.putExtra("imagePath", imageFile.toString());
startActivity(intent);
} else {
if (requestCode == REQUEST_CAMERA) {
{
try {
Uri returnUri = data.getData();
Bitmap bitmapImage = MediaStore.Images.Media.getBitmap(MainActivity.this.getContentResolver(), returnUri);
Intent i = new Intent(this, ShowCameraPhotoActivity.class);
i.putExtra("image", bitmapImage);
startActivity(i);
} catch (IOException e) {
e.printStackTrace();
} }
}}
} }
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
ShowPhotoActivity(this is the activity for gallery):
Bundle extras = getIntent().getExtras();
Uri uri = Uri.parse(extras.getString("imagePath"));
if (showPhoto != null) {
Bitmap bm = BitmapFactory.decodeFile(uri.getPath());
showPhoto.setImageBitmap(bm); }
ShowCameraPhotoActivity(this is the activity for camera):
Bitmap bitmap = (Bitmap) this.getIntent().getParcelableExtra("image");
if (showPhoto != null) {
showPhoto.setImageBitmap(bitmap);
}
manifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
I tried with just one other activity,but that also didn't work. In logcat it says that it happens because getRealPathFromUri(). But I don't know what . If you have any solutions or better ideas,please help me :)
logcat:
Process: com.example.gentaliu.photoeditor, PID: 22360
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.gentaliu.photoeditor/com.example.gentaliu.photoeditor.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3840)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3883)
at android.app.ActivityThread.access$1700(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1426)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1477)
at android.content.ContentResolver.query(ContentResolver.java:473)
at android.content.ContentResolver.query(ContentResolver.java:426)
at com.example.gentaliu.photoeditor.MainActivity.getRealPathFromURI(MainActivity.java:189)
at com.example.gentaliu.photoeditor.MainActivity.onActivityResult(MainActivity.java:105)
at android.app.Activity.dispatchActivityResult(Activity.java:6320)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3836)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3883)
at android.app.ActivityThread.access$1700(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1426)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
09-21 19:11:44.293 22360-22360/com.example.gentaliu.photoeditor I/Process: Sending signal. PID: 22360 SIG: 9
回答1:
There are a few problems with your code, including:
getRealPathFromURI()
is unreliable in general and unnecessary in this case. Pass theUri
itself toShowPhotoActivity
.ShowPhotoActivity
is loading the image on the main application thread. Do not do this. Please use one of many image loading libraries available for Android, as they can load your image asychronously using theUri
. Personally, I use Picasso.You are assuming that you get a
Uri
back fromACTION_IMAGE_CAPTURE
. That is not howACTION_IMAGE_CAPTURE
works.
Instead, replace:
Uri returnUri = data.getData();
Bitmap bitmapImage = MediaStore.Images.Media.getBitmap(MainActivity.this.getContentResolver(), returnUri);
with:
Bitmap bitmapImage = (Bitmap)data.getExtra("data");
来源:https://stackoverflow.com/questions/39622694/how-to-select-an-image-from-gallery-or-to-capture-a-photo-and-then-to-display-it