我想要的只是能够在一个非常特定的文件夹(与我的应用程序相关)中为我的应用程序编写日志/异常报告,以便了解失败和异常,所以这是我使用的代码:
File logFile = new File(Environment.getExternalStorageDirectory() + File.separator + "/appname/log.txt");
if (!logFile.exists()) {
try {
if (logFile.getParentFile().mkdir()) {
if (!logFile.createNewFile())
showPopup(context.getString(R.string.app_name), "error creating log file");
}
} catch (IOException e) {
e.printStackTrace();
}
}
try {
BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
buf.append(text);
buf.newLine();
buf.flush();
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
为了使上述工作,我必须添加以下权限:android.permission.WRITE_EXTERNAL_STORAGE但是当用户读取它时,它表示读取和写入外部存储器,这是可以理解的,这会吓跑用户。是否有更好的方法来记录我的应用程序的行为并使用不那么可怕的权限?
答案 0 :(得分:2)
首先,切换:
File logFile = new File(Environment.getExternalStorageDirectory() + File.separator + "/appname/log.txt");
为:
File logFile = new File(context.getExternalFilesDir(), "log.txt");
这不仅可以在创建路径时避免手动字符串连接,而且不仅可以通过随机的特定于应用程序的目录阻止用户的外部存储混乱,而且现在意味着您可以拥有:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
消除API级别19 +上的WRITE_EXTERNAL_STORAGE
。
除此之外,尝试将targetSdkVersion
提高到4或更高。引用the docs for READ_EXTERNAL_STORAGE
:
注意:如果您的minSdkVersion和targetSdkVersion值都设置为3或更低,系统会隐式授予您的应用此权限。如果您不需要此权限,请确保targetSdkVersion为4或更高。
答案 1 :(得分:0)
试试这个:
File storageDir = new File(Environment.getExternalStorageDirectory(), "your folder name");
storageDir.mkdir();
将此代码放入清单文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />