Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 可编辑应用程序特定文件的内部或外部存储_Android_File_Storage - Fatal编程技术网

Android 可编辑应用程序特定文件的内部或外部存储

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中有两种类型的存储: 内部存储: 当您希望确保用户或其他应用

我正在创建一个应用程序,它需要一个特定于应用程序的文件,例如我称之为“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中有两种类型的存储:

  • 内部存储:
  • 当您希望确保用户或其他应用程序都无法访问您的文件时,最好使用内部存储

  • 外耳道:
  • 外部存储是不需要访问限制的文件以及您希望与其他应用共享或允许用户使用计算机访问的文件的最佳位置

    由于我希望用户能够编辑/下载/上传/使用该文件,因此外部存储似乎是一个不错的选择。但他们说,

    警告:如果用户卸下SD卡或将设备连接到计算机,则外部存储可能不可用。用户和其他具有读取外部存储权限的应用程序仍然可以看到这些文件。因此,如果你的应用程序的功能依赖于这些文件,或者你需要完全限制访问,那么你应该将文件写入内部存储器

    警告:外部存储器上的文件并非总是可访问的,因为用户可以将外部存储器装载到计算机上用作存储设备。因此,如果您需要存储对应用程序功能至关重要的文件,则应将其存储在内部存储器中

    因为此文件需要始终可用,并且对我的应用程序的功能至关重要
    所以内部存储似乎更好。但是我需要用户查看并能够使用该文件。我被困在这里了

    有人知道在哪里以及如何放置/创建此文件吗

    编辑:以下@greenapps答案

    heer是我写的一段代码。我使用
    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...");
        }
    }