open failed: EACCES(权限被拒绝)



我正在开发一个应用程序,我想从网上下载PDF文件的SD卡。

我使用android kitkat (4.4.4)。我得到错误说,java.io.FileNotFoundException: /storage/sdcard1/pdf/953.pdf: open failed: EACCES (Permission denied)下载文件时。当我使用android (4.2)时,它工作良好。

当我在android 4.4.4中运行此代码Environment.getExternalStorageDirectory();时,它返回给我内部存储。在android 4.2中,它返回SD卡位置。

这是我的代码。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ashishkudale.filedownload">
    <uses-permission android:name="android.permission.INTERNET"/>
    <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=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

MainActivity.java

public class MainActivity extends AppCompatActivity {
private Button bt_Download;
private ProgressDialog progressDialog;
public static final int progress_bar_type = 0;
private static String file_url = "http://my_website_url/Data/953.pdf";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bt_Download = (Button) findViewById(R.id.bt_Download);
    bt_Download.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new DownloadFile().execute(file_url);
        }
    });
}
@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case progress_bar_type:
            progressDialog = new ProgressDialog(this);
            progressDialog.setMessage("Downloading...");
            progressDialog.setMax(100);
            progressDialog.setCancelable(true);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setIndeterminate(false);
            progressDialog.show();
            return progressDialog;
        default:
            return null;
    }
}
class DownloadFile extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(progress_bar_type);
    }
    @Override
    protected String doInBackground(String... fileUrl) {
        int count;
        try {
            URL url = new URL(fileUrl[0]);
            URLConnection conection = url.openConnection();
            conection.connect();
            int lenghtOfFile = conection.getContentLength();
            InputStream input = new BufferedInputStream(url.openStream(), 8192);
            File file = new File("/storage/sdcard1/pdf","953.pdf");
            OutputStream output = new FileOutputStream(file);
            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress(""+(int)((total*100)/lenghtOfFile));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }
        return null;
    }
    protected void onProgressUpdate(String... progress) {
        progressDialog.setProgress(Integer.parseInt(progress[0]));
    }
    @Override
    protected void onPostExecute(String fileUrl) {
        dismissDialog(progress_bar_type);
    }
}
}

在异常中被捕获。这是我的异常消息。java.io.FileNotFoundException: /storage/sdcard1/pdf/953.pdf: open failed: EACCES (Permission denied)

我不知道为什么android 4.4.4及以上不允许我在SD卡上写。

我也在网上搜索了很多,但没有得到任何具体的答案。还有别的办法吗?

我正在开发一个应用程序,我想从互联网下载PDF文件的SD卡。

你不能随意访问Android 4.4+上的可移动存储。

当我运行这个代码时Environment.getExternalStorageDirectory();在android 4.4.4中,它返回给我内部存储空间。

它返回外部存储,由Android SDK定义。

在android 4.2中它返回SD卡位置

也许在您的一个测试设备上可以。在绝大多数现代Android设备上,外部存储不是可移动存储。

我不知道为什么android 4.4.4及以上版本不允许我在SD卡上写。

你不能随意访问Android 4.4+上的可移动存储。

还有其他方法吗?

在Android 4.4+上,使用ACTION_CREATE_DOCUMENT —部分存储访问框架—允许用户决定在哪里放置内容。你会得到一个Uri。您可以将其与ContentResolveropenOutputStream()一起使用,将内容写入Uri标识的位置。这也使用户可以灵活地将文件放在用户想要的其他地方,例如Google Drive, Dropbox或任何其他由应用程序存储提供商管理的地方。

相关内容

  • 没有找到相关文章

最新更新