2011-06-03 63 views
2

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

这里是我如何使用直接读取PackageManager文件

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); 
} 

回答

2

,则无法安装的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权限。同时检查你的SD卡是否不通过USB共享(如果是这样,你的应用程序将不具有写入SD卡的权限)。

如果你想改变在Android 2.2的文件权限
+0

是的,这是我用来安装.apk的。但它给了我“解析错误:权限被拒绝”。所以这让我想,也许我需要改变它的权限。你有什么建议吗? – Abhishek 2011-06-03 20:07:56

+0

@Abhishek,你有没有在清单中指定INSTALL_PACKAGES权限? – RivieraKid 2011-07-05 14:55:17

1

和更高您可以使用此:

Runtime.getRuntime().exec("chmod 777 " + PATH + fileName); 
在Android 3.0的

你可以做到这一点还没有使用原生代码解决方法:

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

.setReadable(true,false)来自API 9及更高版本。不适用于Android 3.我非常感兴趣的是如何在API 3 – DKDiveDude 2012-09-16 15:51:51

+0

exec中为所有版本的Android设置文件权限。 – corbin 2014-08-21 22:31:16

0

我还没有尝试完全在这里问什么,但这将改变任何版本的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; 
    } 
} 

这就像什梅尔建议的那样,但是更完整,顺便说一句,他建议1.5以上,而不是2.2以上。