‘Failure delivering result ResultInfo’一次然后在崩溃后正常工作
‘Failure delivering result ResultInfo’ once then works normally after crash
我必须更新我的应用程序以与新的 android 版本一起工作,针对 N 版本,我更新了:
来自:
Uri.fromFile();
至:
FileProvider.getUriForFile();
我是这样做的:
基于:()
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities=" com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
provider_paths:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-cache-path name="external_files" path="."/>
</paths>
FntTakePicture:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
//......
//......
btnTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getContext().getPackageManager()) != null) {
outputFileName = null;
try {
/*if(fragmentPosition == 0 || fragmentPosition == 4)
outputFileName = Images.createImageFile2();//PNG
else
outputFileName = Images.createImageFile3();//JPG*/
outputFileName = Images.createImageFile3();
//takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(outputFileName));
Uri photoURI = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",outputFileName);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(takePictureIntent, RC_IMAGE_CAPTURE);
} catch (IOException e) {
e.printStackTrace();
FirebaseCrash.report(e);
}
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RC_IMAGE_CAPTURE && resultCode == RESULT_OK) {
loadImage(outputFileName.getAbsolutePath());//outputFileName.getAbsolutePath()
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
txtInstructions.setText(Html.fromHtml(
String.format(
getResources().getString(R.string.validate_picture2),
defaultValidateText
),Html.FROM_HTML_MODE_LEGACY
));
} else {
txtInstructions.setText(Html.fromHtml(
String.format(
getResources().getString(R.string.validate_picture2),
defaultValidateText
)), TextView.BufferType.SPANNABLE);
}
btnTakePicture.setText(getString(R.string.take_photo_again));
//this.data.setImage(Images.compressImage(picture),fragmentPosition);
this.data.setImage(outputFileName.getAbsolutePath(),fragmentPosition);
Log.e("Data Picture"," Vin: "+this.data.getVin()+" lon: "+this.data.getLon()+ " lat: "+this.data.getLat());
if(lastPage)
validateContinueBoton();
listener.save(this.data);
}
}
public void loadImage(final String path){
new AsyncTask<Void,Void,Bitmap>(){
@Override
protected Bitmap doInBackground(Void... params) {
return Images.decodeSampledBitmapFromFile(path,
getResources().getDimensionPixelSize(R.dimen.ancho_default)/2);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imgPictureTaken.setScaleType(ImageView.ScaleType.CENTER_CROP);
imgPictureTaken.setImageBitmap(bitmap);
}
}.execute(null,null,null);
}
图片Class:
public class Images{
static File createImageFile3() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date());
String imageFileName = "NTS_Image_" + timeStamp + "_";
File storageDir = ContextCompat.getExternalCacheDirs(App.getContext())[0];
File nf = File.createTempFile(
imageFileName, // prefix
".jpg", // suffix
storageDir // directory
);
nf.deleteOnExit();
return nf;
}
}
此外,这个事件是在片段中,我不知道这是否重要。
在运行安装应用程序后给它权限然后一旦它正常工作就崩溃…
我得到的异常是这样的:
04-17 15:00:10.058 669-669/? E/cnss-daemon:过时或无法访问的邻居,ndm 状态:4
04-17 15:00:10.202 13596-13596/com.mydomain E/AndroidRuntime:致命异常:main
进程:com.mydomain,PID:13596
java.lang.RuntimeException: 未能将结果 ResultInfo{who=null, request=74538, result=-1, data=Intent { act=inline-data (has extras) }} 传送到 activity {com.mydomain/com.mydomain.CaptureWizard}: java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.lang.String java.io.File.getAbsolutePath()'
在 android.app.ActivityThread.deliverResults(ActivityThread.java:4094)
在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4137)
在 android.app.ActivityThread.-wrap20(ActivityThread.java)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529)
在 android.os.Handler.dispatchMessage(Handler.java:102)
在 android.os.Looper.loop(Looper.java:154)
在 android.app.ActivityThread.main(ActivityThread.java:6123)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'java.lang.String java.io.File.getAbsolutePath()'
在 com.mydomain.FntTakePicture.onActivityResult(FntTakePicture.java:201)
在 android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:164)
在 com.mydomain.CaptureWizard.onActivityResult(CaptureWizard.java:133)
在 android.app.Activity.dispatchActivityResult(Activity.java:6931)
在 android.app.ActivityThread.deliverResults(ActivityThread.java:4090)
在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4137)
在 android.app.ActivityThread.-wrap20(ActivityThread.java)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529)
在 android.os.Handler.dispatchMessage(Handler.java:102)
在 android.os.Looper.loop(Looper.java:154)
在 android.app.ActivityThread.main(ActivityThread.java:6123)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
确保您在保存的实例状态 Bundle
中保存 outputFileName
。当您的应用程序处于后台时,您的进程可能会终止,这将导致该字段在您的新进程中默认变为 null
。
我必须更新我的应用程序以与新的 android 版本一起工作,针对 N 版本,我更新了:
来自:
Uri.fromFile();
至:
FileProvider.getUriForFile();
我是这样做的:
基于:(
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities=" com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
provider_paths:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-cache-path name="external_files" path="."/>
</paths>
FntTakePicture:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
//......
//......
btnTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getContext().getPackageManager()) != null) {
outputFileName = null;
try {
/*if(fragmentPosition == 0 || fragmentPosition == 4)
outputFileName = Images.createImageFile2();//PNG
else
outputFileName = Images.createImageFile3();//JPG*/
outputFileName = Images.createImageFile3();
//takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(outputFileName));
Uri photoURI = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",outputFileName);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(takePictureIntent, RC_IMAGE_CAPTURE);
} catch (IOException e) {
e.printStackTrace();
FirebaseCrash.report(e);
}
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RC_IMAGE_CAPTURE && resultCode == RESULT_OK) {
loadImage(outputFileName.getAbsolutePath());//outputFileName.getAbsolutePath()
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
txtInstructions.setText(Html.fromHtml(
String.format(
getResources().getString(R.string.validate_picture2),
defaultValidateText
),Html.FROM_HTML_MODE_LEGACY
));
} else {
txtInstructions.setText(Html.fromHtml(
String.format(
getResources().getString(R.string.validate_picture2),
defaultValidateText
)), TextView.BufferType.SPANNABLE);
}
btnTakePicture.setText(getString(R.string.take_photo_again));
//this.data.setImage(Images.compressImage(picture),fragmentPosition);
this.data.setImage(outputFileName.getAbsolutePath(),fragmentPosition);
Log.e("Data Picture"," Vin: "+this.data.getVin()+" lon: "+this.data.getLon()+ " lat: "+this.data.getLat());
if(lastPage)
validateContinueBoton();
listener.save(this.data);
}
}
public void loadImage(final String path){
new AsyncTask<Void,Void,Bitmap>(){
@Override
protected Bitmap doInBackground(Void... params) {
return Images.decodeSampledBitmapFromFile(path,
getResources().getDimensionPixelSize(R.dimen.ancho_default)/2);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imgPictureTaken.setScaleType(ImageView.ScaleType.CENTER_CROP);
imgPictureTaken.setImageBitmap(bitmap);
}
}.execute(null,null,null);
}
图片Class:
public class Images{
static File createImageFile3() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date());
String imageFileName = "NTS_Image_" + timeStamp + "_";
File storageDir = ContextCompat.getExternalCacheDirs(App.getContext())[0];
File nf = File.createTempFile(
imageFileName, // prefix
".jpg", // suffix
storageDir // directory
);
nf.deleteOnExit();
return nf;
}
}
此外,这个事件是在片段中,我不知道这是否重要。
在运行安装应用程序后给它权限然后一旦它正常工作就崩溃…
我得到的异常是这样的:
04-17 15:00:10.058 669-669/? E/cnss-daemon:过时或无法访问的邻居,ndm 状态:4 04-17 15:00:10.202 13596-13596/com.mydomain E/AndroidRuntime:致命异常:main 进程:com.mydomain,PID:13596 java.lang.RuntimeException: 未能将结果 ResultInfo{who=null, request=74538, result=-1, data=Intent { act=inline-data (has extras) }} 传送到 activity {com.mydomain/com.mydomain.CaptureWizard}: java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.lang.String java.io.File.getAbsolutePath()' 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4094) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4137) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6123) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'java.lang.String java.io.File.getAbsolutePath()' 在 com.mydomain.FntTakePicture.onActivityResult(FntTakePicture.java:201) 在 android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:164) 在 com.mydomain.CaptureWizard.onActivityResult(CaptureWizard.java:133) 在 android.app.Activity.dispatchActivityResult(Activity.java:6931) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4090) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4137) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6123) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
确保您在保存的实例状态 Bundle
中保存 outputFileName
。当您的应用程序处于后台时,您的进程可能会终止,这将导致该字段在您的新进程中默认变为 null
。