在我正在开发的应用中,用户可以在个人资料上定义图像。首次执行该应用程序时,会显示一个介绍性活动,用户可以在其中选择从画廊中选择一张照片还是使用相机拍摄一张新照片。
这很好。用户设置个人资料图片后,我将其保存在app文件夹中,以后可以在应用程序内部使用该图片。
我的应用基于导航抽屉(支持),因此由片段组成。该片段之一是针对用户的个人资料,其中显示了个人资料图片。在这里,用户有机会再次更改此图片。这是我遇到麻烦的地方。
要选择一个新图片,我使用的是与介绍活动中使用的图片相同的代码,只是对片段进行了一些修改(使用getActivity())。但是,似乎没有将映像返回到片段,而是在抛出NPE。
这是从SettingsFragment中的图库中选择图片的方式:
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, PICK_IMAGE_REQUEST_FRAG);
这也是SettingsFragment中的onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICK_IMAGE_REQUEST_FRAG:
if (resultCode == getActivity().RESULT_OK && data != null) {
/*We get the image URI*/
Uri selectedImageUri = data.getData();
Bitmap srcBmp = null;
try {
srcBmp = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImageUri);
} catch (FileNotFoundException e) {
Log.e("GET_IMAGE", e.getMessage(), e);
} catch (IOException e) {
Log.e("GET_IMAGE", e.getMessage(), e);
}
/*Transform the original image to landscape to use it as profile background*/
Bitmap landBmp = null;
if (srcBmp.getWidth() <= srcBmp.getHeight()) {
landBmp = Bitmap.createBitmap(
srcBmp,
0,
srcBmp.getHeight()/2 - srcBmp.getWidth()/2, //srcBmp.getHeight()/4 ?
srcBmp.getWidth(),
srcBmp.getWidth() /2
);
}
/*Scale the bitmap*/
int originalWidth = srcBmp.getWidth();
int originalHeight = srcBmp.getHeight();
int newWidth = 400;
int newHeight = (originalHeight*newWidth)/originalWidth;
Bitmap fullbitmap = Bitmap.createScaledBitmap(landBmp, newWidth, newHeight, true);
/*Save the bitmap in app-folder*/
ContextWrapper cw1 = new ContextWrapper(getActivity().getApplicationContext());
File directory1 = cw1.getDir("profile", Context.MODE_PRIVATE);
if (!directory1.exists()) {
directory1.mkdir();
}
File filepath1 = new File(directory1, "profile_pic.png");
FileOutputStream fos1 = null;
try {
fos1 = new FileOutputStream(filepath1);
fullbitmap.compress(Bitmap.CompressFormat.PNG, 100, fos1);
fos1.close();
} catch (Exception e) {
Log.e("SAVE_FULL_IMAGE", e.getMessage(), e);
}
/*Show background profile pic*/
Drawable drawable = new BitmapDrawable(getResources(), fullbitmap);
header_container.setBackgroundDrawable(drawable);
}
break;
但是如前所述,该应用程序崩溃了,这就是logcat告诉我们的:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131073, result=-1,
data=Intent { dat=content://media/external/images/media/204 flg=0x1 }}
to activity {com.myproject.executer/com.myproject.executer.MainActivity}:
java.lang.NullPointerException at android.app.ActivityThread.deliverResults(ActivityThread.java:3389)
Caused by: java.lang.NullPointerException at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:590)
at com.myproject.executer.SettingsFragment.onActivityResult(SettingsFragment.java:275)
第275行是
Bitmap fullbitmap = Bitmap.createScaledBitmap(landBmp, newWidth, newHeight, true);
因此,我不太了解所发生的情况,因为它说的东西未能使结果对MainActivity不利,并且必须将结果传递给SettingsFragment。
最佳答案
如果onActivityResult()
方法未完成并返回,则系统将其计为传送失败,这就是错误从该消息开始的原因。
在您的代码中,landBmp
似乎为null,因为条件srcBmp.getWidth() <= srcBmp.getHeight()
为false,并且在这种情况下您不初始化landBmp
。这将引发NullPointerException
,并在onActivityResult()
返回之前暂停执行。
关于android - fragment onActivityResult返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30592877/