Android:无法在外部存储上创建文件

Android:无法在外部存储上创建文件,android,Android,我试图在外部存储上创建一个文件,但android在创建时抛出了错误 我已经回答了很多关于stackoverflow的问题,但仍然找不到问题所在 我在清单文件中提供了权限 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jewelmahal.

我试图在外部存储上创建一个文件,但android在创建时抛出了错误

我已经回答了很多关于stackoverflow的问题,但仍然找不到问题所在

我在清单文件中提供了权限

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jewelmahal.jewellerapp">

    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_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=".login.LoginActivity"
            android:label="@string/title_activity_login"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".signup.CompanyDetailsSignupActivity"
            android:label="@string/title_activity_signup"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".signup.UploadTinActivity"
            android:label="@string/upload_tin_title"
            android:theme="@style/AppTheme.NoActionBar" />
    </application>

</manifest>

您需要显式授予它在棉花糖上工作的权限

在build.gradle中将目标更改为棒棒糖或请求权限

您还可以转到设置、应用程序。您的应用程序,并手动授予权限

以下是申请许可的良好指南:


在创建文件之前,首先需要创建目录。使用mkdir/mkdirs函数请仔细查看我的代码,我已经在这样做了。@user2899951我能够创建文件,而使用您的代码没有问题。您可以粘贴整个清单和AsyncTask吗?@Evin1\u我已经添加了AndroidManifest.xml和AsyncTask以在SD上保存图像。@user2899951 Yeap,同样,运行代码时没有错误。
private class SaveImageToSD extends AsyncTask<Bitmap, Integer, String> {
    private Bitmap tinImageBitmap;
    protected void onPreExecute() {
        //Nothing yet
    }

    protected String doInBackground(Bitmap... bitmaps) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        tinImageBitmap = bitmaps[0];
        tinImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        String state = Environment.getExternalStorageState();
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            return null; //Cannot write to Strorage
        }

        Log.d("EXTERNAL_STORAGE", "AVAILABLE FOR READ/WRITE");

        File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "JewelMahal");
        Log.d("Can Write", Environment.getExternalStorageDirectory().canWrite() + "");
        if (!file.mkdirs() && !file.isDirectory()) {
            Log.d("LOG_TAG", "Directory not created");
        }
        else {
            Log.d("LOG_TAG", "Directory created");
        }

        File destination = new File(file.getAbsolutePath() + File.separator + TIN_FILE_PREFIX + System.currentTimeMillis() + ".jpg");

        Log.d("Location:", destination.getAbsolutePath());
        FileOutputStream fo;
        try {
            destination.createNewFile();
            fo = new FileOutputStream(destination);
            fo.write(bytes.toByteArray());
            fo.close();
        } catch (FileNotFoundException e) {
            Log.d("FileNotFound", "dsda");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("IOException", "dsda");
            e.printStackTrace();
        }

        return (tinImagePath=destination.getAbsolutePath());
    }

    protected void onProgressUpdate(Integer... progress) {

    }

    protected void onPostExecute(String tinPath) {
        tinPreview.setImageBitmap(tinImageBitmap);
    }
}
02-10 09:14:52.206 29864-32486/? W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
02-10 09:14:52.215 29864-32486/? W/System.err:     at java.io.File.createNewFile(File.java:939)
02-10 09:14:52.216 29864-32486/? W/System.err:     at com.jewelmahal.jewellerapp.signup.UploadTinActivity$SaveImageToSD.doInBackground(UploadTinActivity.java:65)
02-10 09:14:52.216 29864-32486/? W/System.err:     at com.jewelmahal.jewellerapp.signup.UploadTinActivity$SaveImageToSD.doInBackground(UploadTinActivity.java:33)
02-10 09:14:52.216 29864-32486/? W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
02-10 09:14:52.216 29864-32486/? W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-10 09:14:52.216 29864-32486/? W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
02-10 09:14:52.216 29864-32486/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
02-10 09:14:52.216 29864-32486/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
02-10 09:14:52.216 29864-32486/? W/System.err:     at java.lang.Thread.run(Thread.java:818)
02-10 09:14:52.217 29864-32486/? W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
02-10 09:14:52.220 29864-32486/? W/System.err:     at libcore.io.Posix.open(Native Method)
02-10 09:14:52.220 29864-32486/? W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
02-10 09:14:52.220 29864-32486/? W/System.err:     at java.io.File.createNewFile(File.java:932)
02-10 09:14:52.220 29864-32486/? W/System.err:  ... 8 more