在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中设置文件读取权限的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 5.1 配置文件中读取 Vhosts 中设置的环境变量