博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android从内部存储写入、安装apk提示解析包错误,或者提示Permission Denied,文件不可用解决办法...
阅读量:4684 次
发布时间:2019-06-09

本文共 2463 字,大约阅读时间需要 8 分钟。

做应用商店,下载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

转载于:https://www.cnblogs.com/xieyuan/p/3787516.html

你可能感兴趣的文章
android 练习之路 (八)
查看>>
tp5 中 model 的聚合查询
查看>>
android wear开发之:增加可穿戴设备功能到通知中 - Adding Wearable Features to Notifications...
查看>>
压缩文件函数库(转载)
查看>>
【转】ubuntu12.04没有/var/log/messages解决
查看>>
Oracle EBS 初始化用户密码
查看>>
SYS_CONTEXT 详细用法
查看>>
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
函数的复写
查看>>
17_重入锁ReentrantLock
查看>>
winform窗口关闭提示
查看>>
64款工具,总有合适您的那款
查看>>
我的第一篇博客
查看>>
大数据学习线路整理
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
关于ProjectServer定制化项目中心页面
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>