Android 可编辑应用程序特定文件的内部或外部存储
我正在创建一个应用程序,它需要一个特定于应用程序的文件,例如我称之为“conf.cfg”。这个文件需要由我的应用程序读取,以创建一些对象等。。。文件正文如下所示:Android 可编辑应用程序特定文件的内部或外部存储,android,file,storage,Android,File,Storage,我正在创建一个应用程序,它需要一个特定于应用程序的文件,例如我称之为“conf.cfg”。这个文件需要由我的应用程序读取,以创建一些对象等。。。文件正文如下所示: #激活、级别、类型、正则表达式或数组 0,“批评家”,0,“\\d{4}\\w\\d{3}” 1,“评论家”,1[字数1,字数2] 1,“小调”,0,“\\d{2}-\\w{3}-\\d{4}\\s?\\/?\\s?\\d{2}:\\d{2}” 通过研究,我发现android中有两种类型的存储: 内部存储: 当您希望确保用户或其他应用
#激活、级别、类型、正则表达式或数组
0,“批评家”,0,“\\d{4}\\w\\d{3}”
1,“评论家”,1[字数1,字数2]
1,“小调”,0,“\\d{2}-\\w{3}-\\d{4}\\s?\\/?\\s?\\d{2}:\\d{2}”
通过研究,我发现android中有两种类型的存储:
getExternalFilesDir(null)
命令来写入和存储我的文件
String folderName = "Innovation";
String confFileName = "conf.txt";
String commentSymbol = "#";
String commentLine = commentSymbol + " activation, level, type , regex or array";
File storage = getExternalFilesDir(null);
File folder = new File(storage, folderName);
File conf = new File(folder, confFileName);
Log.d(TAG, "Folder action!");
if (!folder.exists()) {
if (folder.mkdirs()) {
Log.d(TAG, "Created : " + folder.getAbsolutePath());
} else {
Log.e(TAG, "folder not created!");
}
}
Log.d(TAG, "File action!");
if (!conf.exists()) {
try {
Log.d(TAG, "opening...");
FileOutputStream fos = new FileOutputStream(conf);
fos.write(commentLine.getBytes());
fos.close();
Log.d(TAG, "Created : " + conf.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
if (conf.exists()) {
Log.d(TAG, "File exist at : " + conf.getAbsolutePath());
}
将创建该文件,如上一个日志所示
创建:/storage/emulated/0/Android/data/com.aralex.innovation/files/innovation/conf.txt
但是当我用手机的本地文件浏览器应用程序搜索文件时,我找不到它。我可以转到文件夹,但文件夹“Innovation/”被隐藏
这是一个问题,因为我希望文件可见
手机:三星s7、s7edge、s9+
因此需要外部存储
没有内部文件资源管理器,因为文件资源管理器无法访问应用程序的专用内部内存
您可以使用getExternalFilesDir(null),因为这样您就不需要读写权限了我自己终于找到了答案 在@prodev的这篇文章中,指定
Environment.getExternalStorageDirectory()
是一个好地方,因为可以访问该文件,并且:
请注意,Environment.getExternalStorageDirectory()中的ExternalStorage不一定指SD卡,它返回手机的主存储内存
它需要权限(仅适用于生成版本>=M):
下面是一个代码来回答我的问题(它在运行时请求权限):
私有数组列表规则列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
[...]
//在访问相机之前检查存储权限。如果
//权限尚未授予,请请求权限。
if(hasPermissions(这个,Manifest.permission.WRITE\u外部存储,Manifest.permission.READ\u外部存储)
||Build.VERSION.SDK_INTActivityCompat.requestPermissions(此活动,权限,
钢筋混凝土(钢筋混凝土)处理(钢筋混凝土)外部处理(钢筋混凝土);
Snackbar.make(findviewbyd(android.R.id.content)、R.string.permission\u storage\u原理、,
蛇形杆。长度(不确定)
.setAction(R.string.ok,侦听器)
.show();
}
@凌驾
公共无效onRequestPermissionsResult(int requestCode,
@非空字符串[]权限,
@非空int[]grantResults){
if(requestCode!=RC\u HANDLE\u EXTERNAL\u PERM){
Log.d(标记“获得意外权限结果:”+req
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
private ArrayList<Rule> ruleList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[...]
// Check for the storage permission before accessing the camera. If the
// permission is not granted yet, request permission.
if (hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ruleList = createRules();
} else {
requestStoragePermission();
}
}
private boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
Log.d(TAG, "Checking permission : " + permission);
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
Log.w(TAG, "not granted : " + permission);
return false;
} else {
Log.d(TAG, "granted : " + permission);
}
}
}
return true;
}
/**
* Handles the requesting of the storage permission. This includes
* showing a "Snackbar" errorMessage of why the permission is needed then
* sending the request.
*/
private void requestStoragePermission() {
Log.w(TAG, "Storage permission is not granted. Requesting permission");
final String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(this, permissions, RC_HANDLE_EXTERNAL_PERM);
return;
}
final Activity thisActivity = this;
View.OnClickListener listener = view -> ActivityCompat.requestPermissions(thisActivity, permissions,
RC_HANDLE_EXTERNAL_PERM);
Snackbar.make(findViewById(android.R.id.content), R.string.permission_storage_rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, listener)
.show();
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode != RC_HANDLE_EXTERNAL_PERM) {
Log.d(TAG, "Got unexpected permission result: " + requestCode);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
return;
}
if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Storage permission granted");
// We have permission
ruleList = createRules();
return;
}
Log.e(TAG, "Permission not granted: results len = " + grantResults.length +
" Result code = " + (grantResults.length > 1 ? grantResults[0] + " " + grantResults[1] : grantResults.length > 0 ? grantResults[0] : "(empty)"));
DialogInterface.OnClickListener listener = (dialog, id) -> finish();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Assisting Tool")
.setMessage(R.string.no_storage_permission)
.setPositiveButton(R.string.ok, listener)
.show();
}
private ArrayList<Rule> createRules() {
Log.d(TAG, "=========================READING FILE======================");
ArrayList<Rule> ruleList = new ArrayList<>();
String folderName = "Innovation";
String confFileName = "conf.txt";
String commentSymbol = "#";
String commentLine = commentSymbol + " activation, level, type , regex or array";
File storage = Environment.getExternalStorageDirectory();
File folder = new File(storage, folderName);
File conf = new File(folder, confFileName);
Log.d(TAG, "Folder action!");
if (!folder.exists()) {
if (folder.mkdirs()) {
Log.d(TAG, "Created : " + folder.getAbsolutePath());
} else {
Log.e(TAG, "folder not created!");
}
}
Log.d(TAG, "File action!");
if (!conf.exists()) {
try {
Log.d(TAG, "opening...");
FileOutputStream fos = new FileOutputStream(conf);
fos.write(commentLine.getBytes());
fos.close();
Log.d(TAG, "Created : " + conf.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
if (conf.exists()) {
Log.d(TAG, "File exist at : " + conf.getAbsolutePath());
} else {
Log.e(TAG, "The file doesn't exist...");
}
}