【问题标题】:Creating directory in internal storage在内部存储中创建目录
【发布时间】:2016-05-29 22:13:30
【问题描述】:

我认为我的智能手机是一个哑机。 试图创建一个文件夹,它似乎只是不会被创建。 我正在运行 CyanogenMod,但不知道这是否会让它变得疯狂。

这是我一直在测试的:

File folder = new File(getFilesDir() + "theFolder");
if(!folder.exists()){
folder.mkdir();
}

还有这个方法:

File folder = getDir("theFolder",Context.MODE_PRIVATE);

【问题讨论】:

  • “它似乎不会被创建”——你如何确定这个?
  • 当我查看文件资源管理器时,应用程序本身没有自己的文件夹,并且我的应用程序正在生成一个它想从该文件夹中获取的 pdf,但它说它不可能添加文件,因为它确实没有权限
  • "当我查看文件资源管理器时" -- 除非您的设备已植根,否则您无法通过任何文件资源管理器查看设备上的内部存储。我的猜测是您对 Android SDK 术语 internal storage 和 external storage 感到困惑。

标签: android file mkdirs


【解决方案1】:

这个答案很旧,我更新了它。我包括内部和外部存储。我会一步一步解释的。

第 1 步) 您应该声明适当的Manifest.xml 权限;对于我们的情况,这 2 个就足够了。此步骤还需要 6.0 之前和 6.0 之后的版本:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第 2 步) 在这一步中,我们将检查写入外部存储的权限,然后将做任何我们想做的事情。

public static int STORAGE_WRITE_PERMISSION_BITMAP_SHARE =0x1;

public Uri saveBitmapToFileForShare(File file,Uri uri){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
    && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

//in this side of if we don't have permission 
//so we can't do anything. just returning null and waiting user action

    requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
   "permission required for writing external storage bla bla ..."
                REQUEST_STORAGE_WRITE_ACCESS_PERMISSION);
        return null;
    }else{
        //we have right about using external storage. do whatever u want.
        Uri returnUri=null;
        try{
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver() ,uri);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
            returnUri=Uri.fromFile(file);
        }
        catch (IOException e){
            //can handle for io exceptions
        }

        return returnUri;
    }

}

第 3 步) 处理权限原理和显示对话框,请阅读 cmets 了解信息

/**
 * Requests given permission.
 * If the permission has been denied previously, a Dialog will prompt the user to grant the
 * permission, otherwise it is requested directly.
 */
protected void requestPermission(final String permission, String rationale, final int requestCode) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
        showAlertDialog("Permission required", rationale,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(BasePermissionActivity.this,
                                new String[]{permission}, requestCode);
                    }
                }, getString(android.R.string.ok), null, getString(android.R.string.cancel));
    } else {
        ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
    }
}

/**
 * This method shows dialog with given title & content.
 * Also there is an option to pass onClickListener for positive & negative button.
 *
 * @param title                         - dialog title
 * @param message                       - dialog content
 * @param onPositiveButtonClickListener - listener for positive button
 * @param positiveText                  - positive button text
 * @param onNegativeButtonClickListener - listener for negative button
 * @param negativeText                  - negative button text
 */
protected void showAlertDialog(@Nullable String title, @Nullable String message,
                               @Nullable DialogInterface.OnClickListener onPositiveButtonClickListener,
                               @NonNull String positiveText,
                               @Nullable DialogInterface.OnClickListener onNegativeButtonClickListener,
                               @NonNull String negativeText) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton(positiveText, onPositiveButtonClickListener);
    builder.setNegativeButton(negativeText, onNegativeButtonClickListener);
    mAlertDialog = builder.show();
}

第 4 步) 在 Activity 中获取权限结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case STORAGE_WRITE_PERMISSION_BITMAP_SHARE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                shareImage();
            }else if(grantResults[0]==PackageManager.PERMISSION_DENIED){
                //this toast is calling when user press cancel. You can also use this logic on alertdialog's cancel listener too.
                Toast.makeText(getApplicationContext(),"you denied permission but you need to give permission for sharing image. "),Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

第 5 步) 在使用内部存储的情况下。您无需检查运行时权限即可使用内部存储。

//this creates a png file in internal folder
//the directory is like : ......data/sketches/my_sketch_437657436.png
File mFileTemp = new File(getFilesDir() + File.separator
                + "sketches"
                , "my_sketch_"
                + System.currentTimeMillis() + ".png");
        mFileTemp.getParentFile().mkdirs();

您可以阅读此页面以获取有关运行时权限的信息:runtime permission requesting

我的建议:您可以创建一个Activity,它负责像 BasePermissionActivity 这样的权限,并在其中声明方法@Step 3。然后你可以扩展它并在你想要的地方调用你的请求权限。

我也搜索了一下,找到了代码的 Github 链接@Step 3,如果你想检查:yalantis/ucrop/sample/BaseActivity.java

【讨论】:

  • 谢谢。我会测试这个
  • 如果不行告诉我结果我可以给你建议。
  • @Yirga 是的,但策略是一样的。我提到了清单权限和运行时权限,并展示了一个工作代码片段。只需稍作搜索,他就可以为所欲为。
  • @Yirga 我已经编辑了我的答案,包括外部和内部存储的权限。请检查一下。如果您有问题,请告诉我。
  • @YasinKaçmaz 谢谢你的帮助!
【解决方案2】:

您在添加文件名之前忘记添加“/”,因此您的路径编译如下:

/data/data/com.myPackageNametheFolder

File folder = new File(getFilesDir() + "/" + "theFolder");

或

File folder = new File(getFilesDir(),"theFolder");

你会得到这个而不是

/data/data/com.myPackageName/theFolder

PS:没有哑手机,所有手机都是智能手机'Bad dum tss'

【讨论】:

  • 已添加“/”,但我仍然没有得到任何名称为“theFolder”的文件夹
  • 它在那里但是你看不到它,它只能被你的应用程序读取。您可以通过记录file.exists() 的结果来检查它。为了查看您的文件,您需要以编程方式将它们复制到您的外部存储中。
  • 是的,我已经尝试过了。奇怪的是,我仍然没有看到任何可见的文件或文件夹。在清单中也添加了权限。
  • 这是我尝试使用外部存储,它在早期版本中工作,(kitkat),pastebin.com/fWwHvYHC
  • 创建File对象后,还需要调用folder.mkdir()。这将在 /data/data/com.myPackageName/file/ 中创建文件夹
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 2012-06-08
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多