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

3

我试图在外部存储器上创建一个文件,但是安卓在这样做时出现了错误。

我已经查看了许多在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>

AsyncTask

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

请仔细查看我的代码,我已经在这样做了。 - neeraj080
@user2899951,使用您提供的代码,我已经成功创建了文件。您能否粘贴您完整的清单文件和AsyncTask代码? - Evin1_
@user2899951 是的,再次运行你的代码时没有出现任何错误。http://i.imgur.com/0wDSY7d.png - Evin1_
@Evin1_ Environment.getExternalStorageDirectory().canWrite() 对我来说是错误的。你所说的TIN_FILE_PREFIX与此有关吗? - neeraj080
@user2899951 你正在使用模拟器吗?如果是,那么是哪一个? - Evin1_
显示剩余4条评论
1个回答

2

在Marshmallow版本中,需要显式授予权限才能使其正常工作。

要么在build.gradle中将目标更改为Lollipop,要么请求权限。

您也可以转到设置,应用程序。您的应用程序,并在那里手动授予权限。

这里有一个很好的请求权限指南:

https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接