在android中设置文件读取权限

Posted

技术标签:

【中文标题】在android中设置文件读取权限【英文标题】:set file read permission to file in android 【发布时间】:2011-09-08 01:16:08 【问题描述】:

我正在编写一个从 url 下载 *.apk 然后尝试安装它的应用程序。 尝试让 PackageManager 安装它时,我似乎遇到了 Permission denied 错误。 我想将文件的权限设置为从 java 代码中读取。你是怎么做到的。

这是我阅读文件的方式

InputStream input = new BufferedInputStream(url.openStream());
 OutputStream output = new FileOutputStream(PATH + fileName);

 byte data[] = new byte[1024];


 int count;

while((count = input.read(data)) != -1) 
                total += count;
                output.write(data, 0, count);

【问题讨论】:

【参考方案1】:

您不能直接使用PackageManager 安装 .apk 文件。只有系统应用程序才能做到这一点。

但您可以要求系统使用标准安装工作流程安装应用程序。这是一个例子:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(pathToApk));
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);

这一切都假设您确实成功下载了.apk。但是,如果您在该步骤失败,您应该检查您的WRITE_EXTERNAL_STORAGE 权限。并检查您的 sdcard 是否未通过 USB 共享(如果是,您的应用程序将没有 sdcard 的写入权限)。

【讨论】:

是的,这是我用来安装 .apk 的。但它给了我“解析错误:权限被拒绝”。所以这让我觉得也许我需要更改它的权限。你对此有什么建议吗? @Abhishek,您是否在清单中指定了 INSTALL_PACKAGES 权限?【参考方案2】:

如果您想在 android 2.2 及更高版本上更改文件权限,您可以使用:

Runtime.getRuntime().exec("chmod 777 " + PATH + fileName);

在 android 3 中,您也可以在不使用本机代码解决方法的情况下做到这一点:

new java.io.File(PATH + fileName).setReadable(true, false);

【讨论】:

.setReadable(true, false) 来自 API 9 及更高版本。不适用于 Android 3。我对如何在 API 3 中设置文件权限非常感兴趣【参考方案3】:

我还没有尝试过这里问的是什么,但这会改变任何版本的 android 中的文件权限:

exec("chmod 0777 " + fileOfInterest.getAbsolutePath());  //whatever permissions you require

private void exec(String command) 
    Runtime runtime = Runtime.getRuntime();
    Process process;
    try 
        process = runtime.exec(command);
        try 
            String str;
            process.waitFor();
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            while ((str = stdError.readLine()) != null) 
                Log.e("Exec",str);
                mErrOcc = true;  //I use this elsewhere to determine if an error was encountered
            
            process.getInputStream().close();
            process.getOutputStream().close();
            process.getErrorStream().close();
         catch (InterruptedException e) 
            mErrOcc = true;
        
     catch (IOException e1) 
        mErrOcc = true;
    

这就像 Shmuel 的建议,但更完整,顺便说一句,他的建议在 1.5 及更高版本中有效,而不是 2.2 及更高版本。

【讨论】:

以上是关于在android中设置文件读取权限的主要内容,如果未能解决你的问题,请参考以下文章

Android 图片视频存储和读取

在 Android 应用程序的文件中设置可执行权限

如何在vbs中设置可以在调用批处理脚本中读取的环境变量

在 Laravel 5.1 配置文件中读取 Vhosts 中设置的环境变量

在一个类中设置一个函数,该函数将以一种可以在未来函数中引用的方式读取 csv 数据

Android 开发中eclipse 下 DDMS 视图中 sdcard 中文件导入的处理