【问题标题】:set file read permission to file in android在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);
}

【问题讨论】:

    标签: java android file-permissions


    【解决方案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 及更高版本。

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 2013-05-11
      • 2011-08-08
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2011-11-27
      • 2014-07-03
      • 1970-01-01
      相关资源
      最近更新 更多