我是Android开发的菜鸟,我无法返回相机拍摄的图像。当我垂直拍摄照片/肖像时,我的应用程序运行正常,但是当水平/横向拍摄照片时,应用程序崩溃时出现错误,显示失败传递结果ResultInfo {who = null,request = 1,result = -1,data = null }。我调整了宽度和宽度我输出图片的高度没有成功。非常感谢任何帮助。
我的代码
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
//check if we are returning from picture selection
if (requestCode == PICKER) {
//the returned picture URI
// Uri pickedUri = data.getData();
//declare the bitmap
Bitmap pic = null;
//declare the path string
String imgPath = "";
//retrieve the string using media data
String[] medData = { MediaStore.Images.Media.DATA };
//query the data
Cursor picCursor = managedQuery(outputFileUri, medData, null, null, null);
if(picCursor!=null)
{
//get the path string
int index = picCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
picCursor.moveToFirst();
imgPath = picCursor.getString(index);
}
else
imgPath = outputFileUri.getPath();
//if and else handle both choosing from gallery and from file manager
//if we have a new URI attempt to decode the image bitmap
if(outputFileUri!=null) {
//set the width and height we want to use as maximum display
int targetWidth = 600;
int targetHeight = 400;
//sample the incoming image to save on memory resources
//create bitmap options to calculate and use sample size
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
//first decode image dimensions only - not the image bitmap itself
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imgPath, bmpOptions);
//work out what the sample size should be
//image width and height before sampling
int currHeight = bmpOptions.outHeight;
int currWidth = bmpOptions.outWidth;
//variable to store new sample size
int sampleSize = 1;
//calculate the sample size if the existing size is larger than target size
if (currHeight>targetHeight || currWidth>targetWidth)
{
//use either width or height
if (currWidth>currHeight)
sampleSize = Math.round((float)currHeight/(float)targetHeight);
else
sampleSize = Math.round((float)currWidth/(float)targetWidth);
}
//use the new sample size
bmpOptions.inSampleSize = sampleSize;
//now decode the bitmap using sample options
bmpOptions.inJustDecodeBounds = false;
//get the file as a bitmap
pic = BitmapFactory.decodeFile(imgPath, bmpOptions);
if(currentPic<=10){
//pass bitmap to ImageAdapter to add to array
imgAdapt.addPic(pic);
currentPic++;
}
//redraw the gallery thumbnails to reflect the new addition
picGallery.setAdapter(imgAdapt);
//display the newly selected image at larger size
picView.setImageBitmap(pic);
//scale options
picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
}
}
//superclass method
super.onActivityResult(requestCode, resultCode, data);
}
logcat的
04-03 08:26:46.113: E/AndroidRuntime(15318): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.pickenssurvey/com.example.pickenssurvey.PictureGallery}: java.lang.NullPointerException
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2534)
04-03 08:26:46.113: E/AndroidRuntime(15318): ... 13 more
04-03 08:26:46.113: E/AndroidRuntime(15318): Caused by: java.lang.NullPointerException
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.content.ContentResolver.acquireProvider(ContentResolver.java:913)
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.content.ContentResolver.query(ContentResolver.java:305)
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.app.Activity.managedQuery(Activity.java:1742)
04-03 08:26:46.113: E/AndroidRuntime(15318): at com.example.pickenssurvey.PictureGallery.onActivityResult(PictureGallery.java:241)
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.app.Activity.dispatchActivityResult(Activity.java:4723)
04-03 08:26:46.113: E/AndroidRuntime(15318): at android.app.ActivityThread.deliverResults(ActivityThread.java:3175)
答案 0 :(得分:2)
当您的屏幕方向发生变化时,您的活动将被销毁并以新方向重新创建。因此,在Activity生命周期中获得引用的任何变量将不再引用任何内容,如果您尝试访问它们引用的对象而不重新赋值,则会出现NullPointerException。
onSaveInstanceState()方法用于在配置更改之间保存临时数据。这会创建一个Bundle,当Activity再次启动时会传递给onCreate()。
没有任何代码,我不知道这是不是你的问题,但值得一看。
有关详细信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges(毫无疑问,这些信息比我提供的信息更准确)。
不是我从其他帖子中复制的
答案 1 :(得分:2)
您想在应用中支持纵向和横向视图吗?如果没有,可以通过防止方向改变来解决问题。将以下代码放入onCreate:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
仍然可以更改相机意图中的方向。
答案 2 :(得分:1)
我之前遇到过这个问题,并没有看到任何符合我原因的答案。
问题是:
解决方案:
onSaveInstanceState
方法中onRestoreInstanceState
中的Bundle中检索文件,为片段onCreateView
检索文件