我将文件本地保存到应用程序的私有存储中。我已经验证它存在,但每当我调用BitmapFactory.decodeFile时,它总是返回null。
如果我将文件保存为资源并使用ImageView setImageResource,它总是显示正常。
有什么问题?
以下是摘录:
filename = "test.png";
if (doesFileExist(filename))
Bitmap bMap = BitmapFactory.decodeFile(filename);
我也试过了:
Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
+ filename);
答案 0 :(得分:30)
这个问题在此之前已得到解答: BitmapFactory.decodeFile returns null even image exists
这正是我所需要的:
String fname=new File(getFilesDir(), "test.png").getAbsolutePath();
答案 1 :(得分:3)
应该以特殊方式引用存储在应用程序资源中的文件。例如。如果文件位于资产中并命名为“myfile.png”,则必须将其引用为:
String uriString="file:///android_asset/myfile.png";
Uri uri=Uri.parse(uriString);
答案 2 :(得分:2)
尝试使用InputStream:
,而不是使用BitmapFactory.decodeFile@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
InputStream imageStream = getContentResolver().openInputStream(selectedImage);
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
答案 3 :(得分:2)
BitmapFactory.decodeFile
需要不带方案的文件路径。即开头没有file://
。
如果您正在处理Uri,则不仅要.toString()
,还应在其上调用.getPath()
,并将其传递给方法。
答案 4 :(得分:1)
添加所需权限后(READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE)
您需要将此行添加到清单中:
android:requestLegacyExternalStorage="true"
答案 5 :(得分:0)
你能试试fileList()吗?它
返回一个命名的字符串数组 与此相关的私人文件 Context的应用程序包。
答案 6 :(得分:0)
对我来说,我从本地保存的URL获取图像,例如" file:///storage/emulated/0/...." (我使用Phonegap插件捕获图像。插件给了我图像路径,我需要在本机代码中使用)
以下是适用于我的代码段。
String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);
InputStream imageStream = getContentResolver().openInputStream(uri);
Bitmap bm = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] decodedBytes = baos.toByteArray();
Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
答案 7 :(得分:0)
您需要为Manifest.permission.READ_EXTERNAL_STORAGE设置运行时权限 如果不这样做,您将得到一个null,而不会在日志中得到任何错误消息甚至指示。 请注意,您需要在清单中和运行时都请求权限。