gpt4 book ai didi

android - 相机在 Nougat 7.0 中不工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:55:46 24 4
gpt4 key购买 nike

我的相机代码适用于所有 Android 版本,但在 Nougat 7.0 中出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference

它在除 android 7.0 之外的所有其他 android 版本上都能完美运行。我已授予相机和画廊的运行时权限,但相机仍无法正常工作。相关代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK) {
if(requestCode == Constants.CROPPED_PIC_REQUEST_CODE){
CropImage.ActivityResult result = (CropImage.ActivityResult) data.getExtras().get(CropImage.CROP_IMAGE_EXTRA_RESULT);
Uri selectedImageUri = result == null ? null : result.getUri();
Bitmap bitmap = null;
Log.d("SetUpProfile","Uri cropped is "+outputFileUri);
bitmap = getBitmap(selectedImageUri);
// bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);
circleImageView.setImageBitmap(bitmap);
finalBitmap = bitmap;
}
else if (requestCode == Constants.YOUR_SELECT_PICTURE_REQUEST_CODE) {
final boolean isCamera;
if (data == null) {
isCamera = true;
} else {
final String action = data.getAction();
if (action == null) {
isCamera = false;
} else {
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}

Uri selectedImageUri;
if (isCamera) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String value = prefs.getString("path", "error");
selectedImageUri = Uri.parse(value);
} else {
selectedImageUri = data == null ? null : data.getData();
}

Intent i = new Intent(Five.this,CropImageActivity.class);
i.putExtra("ImageURI", selectedImageUri.toString());
startActivityForResult(i,Constants.CROPPED_PIC_REQUEST_CODE);

}
}
}

这是我的日志:-

FATAL EXCEPTION: main
Process: com.sancsvision.wayndr, PID: 31570
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=Intent { }} to activity {com.sancsvision.wayndr/com.sancsvision.wayndr.Five}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4053)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4096)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1516)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
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.toString()' on a null object reference
at com.sancsvision.wayndr.Five.onActivityResult(Five.java:259)
at android.app.Activity.dispatchActivityResult(Activity.java:6917)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4049)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4096)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1516)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

最佳答案

尝试这不是制造问题的 Intent ,一旦您拍摄照片并保存到 SD 卡并取回牛轧糖中的 URI 不同....

在您的应用程序上实现 FileProvider 非常容易。首先,您需要在 AndroidManifest.xml 中添加一个 FileProvider 标签,如下所示: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>

然后在res文件夹下的xml文件夹中创建一个provider_paths.xml文件。如果文件夹不存在,可能需要创建。

res/xml/provider_paths.xml

 <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>

完成! FileProvider 现已声明并可以使用。

最后一步是更改 MainActivity.java 中的以下代码行

 Uri photoURI = Uri.fromFile(createImageFile());

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
BuildConfig.APPLICATION_ID + ".provider",
createImageFile());

然后……完成了!您的应用程序现在应该可以在包括 Android Nougat 在内的任何 Android 版本上完美运行。干杯!

关于android - 相机在 Nougat 7.0 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41958462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com