我有一个应用程序(商业版),它在其缓存目录中创建一个数据文件(csv格式)。我需要在我的应用程序中读取此数据文件以分析数据。
但是当我尝试使用inputStream方法读取具有绝对路径访问权限的文件时,我会捕获一个权限被拒绝的。
所以我想我必须改变或要求许可,但我不完全理解。我是android开发的初学者我读了一些关于内容提供者,外部存储的文章,但没有解决我的问题。你能帮帮我吗?...
我的代码:
List<String> RowDataFile = new ArrayList<String>();
FileInputStream input = null;
String filePath = "storage/emulated/0/Android/data/com.lifescan.reveal/cache";
//String filePath = "storage/emulated/0/Android/data/vincent.gridlayout/files";
File f = new File(filePath,"/data.csv");
try {
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
for (String line = br.readLine(); line != null; line = br.readLine()) {
RowDataFile.add(line);
}
} catch (IOException e) {e.printStackTrace();}
logcat中生成的异常:
08-12 12:37:21.254 30563-30563 / vincent.gridlayout W / System.err:java.io.FileNotFoundException:/storage/emulated/0/Android/data/com.lifescan.reveal/cache/data .csv:打开失败:EACCES(权限被拒绝)
Android设备系统:4.4.2
和清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="vincent.heatMap">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".HeatMapEdit"></activity>
</application>
</manifest>
感谢您的帮助......
答案 0 :(得分:2)
根据您的logcat输出,这看起来不像是一个简单的清单权限问题。您似乎正在尝试从另一个应用程序internal storage cache访问该文件,该文件是私有到该应用程序。
为了让其他应用程序从内部存储共享文件,它必须在其清单中指定FileProvider
。请查看Sharing Files上的文档,以便在一个应用中设置FileProvider
,并从另一个应用请求共享文件。
注意:以前可以从另一个应用的内部存储中访问文件,如果该文件是使用 上下文模式
MODE_WORLD_READABLE
或MODE_WORLD_WRITEABLE
。虽然, 自API级别17以来,这两个常量都已被弃用 从API级别24开始,他们的使用将导致SecurityException
被抛出。