我在我的项目中有一个类,用来上传一张图片并保存到我的数据库中,如果成功的话,保存到本地,这样我就可以把图片保存到我在android手机上创建的自定义文件夹中。
然而,在另一个类中,我尝试下载一个文本格式的编码图像,并使用上面使用的方法将其保存在本地,但它不再工作了。
我不明白它在我的另一个班级上是如何工作的,而在这个班级上却不是
我试着检查清单文件,看看是否包含了所需的权限,以及它们是否在正确的位置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="buenaventura.dorothy.tbmgmtapp">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/lungs"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
tools:replace="android:icon">
...
[EDIT]好的,我尝试删除文件路径中的空格,以检查空格是否确实是导致问题的原因,但仍然不起作用
File folder = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM) + File.separator + "TBSystem" + File.separator + patient_id + File.separator + "lab_result_" + sqlDateToString(result_date) + ".jpg");
还有,为什么它能在我的另一个有空格的类上工作,而不能在这个类上工作呢
File folder = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM) + File.separator + "TB System" + File.separator + patient_id);
if (!folder.exists()) {
folder.mkdirs();
}
folder = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM) + File.separator + "TB System" + File.separator + patient_id + File.separator + "lab_result_" + result_date + ".jpg");
byte[] decodedBytes = Base64.decode(encoded_image, 0);
Bitmap imageBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
try (
FileOutputStream out = new FileOutputStream(folder)) {
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (IOException e) {
e.printStackTrace();
}
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/DCIM/TB System/pat1/lab_result_2019-04-06.jpg (No such file or directory)
W/System.err: at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:308)
at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
at buenaventura.dorothy.tbmgmtapp.db_volley.VolleyDownloadRequest$1.onResponse(VolleyDownloadRequest.java:569)
at buenaventura.dorothy.tbmgmtapp.db_volley.VolleyDownloadRequest$1.onResponse(VolleyDownloadRequest.java:103)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
patient_id和result_date只是字符串。encoded_image是lontext
我需要能够将我下载的编码文本转换为位图,并将其保存在自定义文件夹“TB系统”中,我希望在DCIM中找到它。另一个文件夹应该在TB系统中创建(即pat1,pat2,pat3,...),图像将保存在这些文件夹中。
4条答案
按热度按时间cotxawn71#
我发现你使用的路径在“TB”和“System”之间包含空格,这可能会导致问题。你的其他类也包含带空格的文件路径吗?如果不包含,这可能是问题所在。
看看这个other question,它可以帮助处理文件路径中的空格。答案从未得到批准,所以我不确定是否真的解决了这个问题,但他们提到了下面的代码片段:
parse修复了路径中所有的空格/反斜杠/非法字符问题,并生成了一个“好的”URI。
plupiseo2#
您是否检查了读写权限。
必须以编程方式签入READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE
用这个
如果是真的做你的工作
如果为false,则调用此方法
再加上这个代码
gr8qqesn3#
有一个问题,在你的代码,我已经测试了与空间的组合在文件夹&也与确切的文件名,它是工作.工作代码片段基于你的问题如下,
已成功下载映像快照
代码布局视图
build.gradle
strings.xml
external_files.xml
network_security_config.xml
GenericFileProvider.java
FileDownloader.java
MainActivity.java
activity_main.xml
AndroidManifest.xml
应用程序启动器屏幕
读取图像输出
q9rjltbz4#
在访问或写入文件之前,创建其父文件和文件本身,以确保安全。在这种情况下...就在try catch块之前,或至少在FileOutputStream行之前,通过
if (!folder.exists()) folder.createNewFile();
创建文件您需要存储权限(读写外部存储)才能在应用程序的数据目录之外创建文件
这可能会有帮助