首页 > 技术文章 > android从内部存储写入、安装apk提示解析包错误,或者提示Permission Denied,文件不可用解决办法

xieyuan 2013-09-01 14:04 原文

做应用商店,下载apk,考虑一种情况,如果没有sd卡的情况下就将apk下载到 Internal Cache目录下。


下载都正常,但是在安装的时候提示Permission Denied


/data/data/mypackage/apps/app.apk': Permission denied 
好像是因为data目录下的文件只有r+w权限,没有x(执行)权限,MODE_PRIVATE。


FileOutputStream fos = openFileOutput("app.apk", Context.MODE_PRIVATE);
有一种解决方案是,在下载apk创建输出流的时候指定读写权限:


[java] view plaincopy
String fileName = "tmp.apk";  
FileOutputStream fos = openFileOutput(fileName,MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);  
File fileLocation = new File(context.getFilesDir(), fileName);  
Intent intent = new Intent(Intent.ACTION_VIEW);  
intent.setDataAndType(Uri.fromFile(fileLocation),"application/vnd.android.package-archive");  
context.startActivity(intent);  


此方案可行,但是我所做的下载使用的断点续传,RandomAccessFile.在构造方法中没办法像openFileOutput(fileName,MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);一样指定读写权限。所以弃之。

然后在stackoverflow上找到了另外的方案,手动授权:

try {
String[] args2 = { "chmod", "604", apkpath};
Runtime.getRuntime().exec(args2);
} catch (IOException e) {
e.printStackTrace();
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" +apkpath), "application/vnd.android.package-archive");

mContext.startActivity(intent);


摘自:http://blog.csdn.net/voiceofnet/article/details/9214315


在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定权限。
例如我用ls -l命令列文件表时,得到如下输出:
-rw-r--r--  1 bu users  2254 2006-05-20 13:47 tt.htm
从第二个字符起rw-是说用户bu有读、写权,没有运行权,接着的r--表示用户组users只有读权限,没有运行权,最后的r--指其他人(others)只有读权限,没有写权和运行权。这是系统默认设置,我可以改写tt.htm,同组的人和其他人只有权读,没人有权运行,因为只是一个html文件,不必运行。这在Novell的directory services之前很先进。
读、写、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,上面的例子中的rw-r--r--用数字表示成644。
反过来说777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限。
再多说一句。我用chmod o-r tt.htm命令改权限,o-r是others的权限中减掉读。结果是
-rw-r-----  1 bu users 2254 2006-05-20 13:47 tt.htm
如果用命令chmod 777 tt.htm,结果是
-rwxrwxrwx  1 bu users 2254 2006-05-20 13:47 tt.htm
任何人都有读、写、运行三项权限。

文件/目录权限设置命令:chmod 

这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限。该命令有两种用法: 

用包含字母和操作符表达式的文字设定法 

其语法格式为:chmod [who] [opt] [mode] 文件/目录名 

其中who表示对象,是以下字母中的一个或组合: 

u:表示文件所有者 
g:表示同组用户 
o:表示其它用户 
a:表示所有用户 
opt则是代表操作,可以为: 
+:添加某个权限 
-:取消某个权限 
=:赋予给定的权限,并取消原有的权限 
而mode则代表权限: 
r:可读 
w:可写 
x:可执行 

例如:为同组用户增加对文件a.txt的读写权限: 

chmod g+rw a.txt 

用数字设定法 

而数字设定法则更为简单:chmod [mode] 文件名 

关键是mode的取值,一开始许多初学者会被搞糊涂,其实很简单,我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r- -则可以表示成为: 

111 101 100 

再将其每三位转换成为一个十进制数,就是754。 

例如,我们想让a.txt这个文件的权限为: 

自己 同组用户 其他用户 
可读 是 是 是 
可写 是 是 可执行 

那么,我们先根据上表得到权限串为:rw-rw-r--,那么转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到664,因此我 们执行命令: 

chmod 664 a.txt

推荐阅读