gpt4 book ai didi

android - 在 Android Nougat 上拍摄照片后,BitmapFactory 无法从 Uri 解码位图

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:06 24 4
gpt4 key购买 nike

我尝试拍照,然后使用照片。这是我所做的。

我的设备是 Nexus 6P (Android 7.1.1)

首先,我创建了一个Uri:

Uri mPicPath = UriUtil.fromFile(this, UriUtil.createTmpFileForPic());
//Uri mPicPath = UriUtil.fromFile(this, UriUtil.createFileForPic());

然后,我开始Intent:

Intent intent = ActivityUtils.getTakePicIntent(mPicPath);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, RequestCode.TAKE_PIC);
}

最后,我在 onActivityResult 上处理了这个 Uri:

if (requestCode == RequestCode.TAKE_PIC) {
if (resultCode == RESULT_OK && mPicPath != null) {
Bitmap requireBitmap = BitmapFactory.decodeFile(mPicPath.getPath());
//path is like this: /Download/Android/data/{@applicationId}/files/Pictures/JPEG_20170216_173121268719051242.jpg
requireBitmap.recycle();//Here NPE was thrown.
}
}

同时,这里有UriUtil:

public class UriUtil {

public static File createFileForPic() throws IOException {
String fileName = "JPEG_" + new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(new Date()) + ".jpg";
File storageDic = SPApplication.getInstance().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return new File(storageDic, fileName);
}

public static File createTmpFileForPic() throws IOException {
String fileName = "JPEG_" + new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(new Date());
File storageDic = SPApplication.getInstance().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return File.createTempFile(fileName, ".jpg", storageDic);
}

public static Uri fromFile(@NonNull Context context, @NonNull File file) {
if (context == null || file == null) {
throw new RuntimeException("context or file can't be null");
}
if (ActivityUtils.requireSDKInt(Build.VERSION_CODES.N)) {
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".file_provider", file);
} else {
return Uri.fromFile(file);
}
}
}

getTakePicIntent(Uri):

public static Intent getTakePicIntent(Uri mPicPath) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mPicPath);
if (!ActivityUtils.requireSDKInt(Build.VERSION_CODES.KITKAT_WATCH)) {//in pre-KitKat devices, manually grant uri permission.
List<ResolveInfo> resInfoList = SPApplication.getInstance().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
SPApplication.getInstance().grantUriPermission(packageName, mPicPath, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
} else {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
return intent;
}

requireSDKInt:

public static boolean requireSDKInt(int sdkInt) {
return Build.VERSION.SDK_INT >= sdkInt;
}

Android Nougat(7.x.x) 外,一切都适用于不同的 Android API。即使提供了“FileProvider”,“requireBitmap”也总是返回为“null”。

读取日志后,BitmapFactory 抛出了 FileNotFoundException。就像:

BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /Download/Android/data/{@applicationId}/files/Pictures/JPEG_20170216_1744551601425984925.jpg (No such file or directory)

看起来一切都清楚了,但我还是不明白。

怎么可能呢?显然我创建了一个 File!我该如何解决?有什么想法吗?

最佳答案

我试过你的代码。这是我的尝试示例。 https://github.com/raghunandankavi2010/SamplesAndroid/tree/master/StackOverFlowTest .

看看这个博客 https://commonsware.com/blog/2016/03/15/how-consume-content-uri.html

在博客 commonsware 中提到你不应该做 new File (mPicPath.getPath())

相反,您应该在 onActivityResult 中使用以下内容

try {
InputStream ims = getContentResolver().openInputStream(mPicPath);
// just display image in imageview
imageView.setImageBitmap(BitmapFactory.decodeStream(ims));
} catch (FileNotFoundException e) {
e.printStackTrace();
}

还有xml

 <external-files-path name="external_files" path="path" />

注意:它是您拥有的内容 uri。在我的手机上,我得到如下 uri。仅在 Nexus6p 上测试。

content://com.example.raghu.stackoverflowtest.fileProvider/external_files/Pictures/JPEG_20170424_161429691143693160.jpg

有关文件提供程序的更多信息 https://developer.android.com/reference/android/support/v4/content/FileProvider.html

关于android - 在 Android Nougat 上拍摄照片后,BitmapFactory 无法从 Uri 解码位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264204/

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