【问题标题】:How to create a new folder in android DCIM如何在android DCIM中创建一个新文件夹
【发布时间】:2016-06-01 00:37:57
【问题描述】:

我实际上能够拍摄照片并将其保存在 android 外部存储 DCIM 文件夹中。

我的问题是我无法在其中创建新文件夹,所以 DCIM/MyPic.jpg 变成了 DCIM/MyFolder/MyPic.jpg

这是我的源代码:

File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "address");

if (!f.exists()) {
    f.mkdir();
}

File file = new File(Environment.getExternalStorageDirectory()
     + File.separator
     + "DCIM"
     + File.separator
     + "address"
     + File.separator
     , "IMG_001.jpg");

请注意,我在清单中正确请求了 WRITE_EXTERNAL_STORAGE 权限。

拍摄照片的意图部分很好,因为我可以将它直接保存到 DCIM。

我没有收到任何错误消息,但没有任何反应...没有创建“地址”文件夹:(

感谢您的帮助:D

【问题讨论】:

  • 您在哪个目标平台上运行?
  • Min : 15, Target : 23。我可以提一下 f.mkdir() 总是返回 false。
  • 我读了这篇文章,但它并没有帮助我解决我的问题:stackoverflow.com/questions/7212559/android-mkdir-returns-false
  • 您需要根据 API 23 + 的新权限模型以编程方式请求权限。
  • 没有解决问题。已授予许可。如果没有,我无法直接在 DCIM 中保存文件,但我可以。

标签: android


【解决方案1】:

正如 cmets 中所发布的,我尝试了您的代码,它对我有用。

MainActivity.java

public class MainActivity extends Activity {

    private final static String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "address");

        if (!f.exists()) {
            Log.d(TAG, "Folder doesn't exist, creating it...");
            boolean rv = f.mkdir();
            Log.d(TAG, "Folder creation " + ( rv ? "success" : "failed"));
        } else {
            Log.d(TAG, "Folder already exists.");
        }
    }
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tristan.testcreatedirectory">

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

在启动应用程序之前,我必须手动启用权限,因为我使用的是 Android 6。

** 首次启动应用时的日志**

D/MainActivity: Folder doesn't exist, creating it...
D/MainActivity: Folder creation success

** 第二次启动应用时的日志**

D/MainActivity: Folder already exists.

【讨论】:

  • 非常感谢您的回答,但相同的代码对我不起作用:(我无法创建目录然后在其中保存图像。
  • 运行我的代码时的日志是什么?可以帮我贴一下吗?
  • D/MainActivity:文件夹不存在,正在创建它... D/MainActivity:文件夹创建失败
  • 好的,你能在 mkdir 函数中设置断点吗? (不是调用,是实现)。应该有一个 try/catch ,在 catch 子句中返回 false 。在 return false 上放一个断点;行并调试您的应用程序。您应该能够看到异常的值以及它不想创建文件夹的原因。
  • 我明天试试。感谢您的宝贵时间!
【解决方案2】:
boolean hasPermission = (ContextCompat.checkSelfPermission(this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);

if (!hasPermission) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_WRITE_STORAGE);
}

else {
    createFolder();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
                createFolder();

            } else
            {
                Toast.makeText(this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}

public void createFolder() {

    final File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "address");

    if (!f.exists()) {
        Toast.makeText(this, "Folder doesn't exist, creating it...", Toast.LENGTH_SHORT).show();
        boolean rv = f.mkdir();
        Toast.makeText(this, "Folder creation " + ( rv ? "success" : "failed"), Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "Folder already exists.", Toast.LENGTH_SHORT).show();
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多