要做一个自动更新功能,我需要下载一个APK包,然后调用系统的安装来安装这个APK,就是自己下载自己然后安装自己。
我把APK下载到SD卡里,一切相安无事,可以顺利进行
但是我要是把APK下载到机身存储空间,就有问题了1. 下载到/data/data/xx.xx.xx/files 目录下 可以下载成功,但是安装的时候会提示解析包错误。
2. 下载到/system或者/cache,文件创建不成功,好像是权限问题。请问我怎么才能在机身存储来完成自动更新功能,因为不能强迫别人去插一张SD才能用。我调用系统安装的代码:
String tPath = downLoadFilePath;
File mainFile = new File(tPath);
if (mainFile.exists()) {
Uri data = Uri.fromFile(mainFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(data,
"application/vnd.android.package-archive");
startActivity(intent);
}下载文件后存储:
File tFile = new File(saveFilePath); //saveFilePath可以是SD卡耶可以是机身存储。
if(tFile.exists())
{
tFile.delete();
}
if(!tFile.exists())
{
FileOutputStream fos = new FileOutputStream(tFile);
fos.write(saveBuffer);
fos.flush();
fos.close();
if(tFile.exists())
{
return tFile;
}
}求解答,谢谢了。
我把APK下载到SD卡里,一切相安无事,可以顺利进行
但是我要是把APK下载到机身存储空间,就有问题了1. 下载到/data/data/xx.xx.xx/files 目录下 可以下载成功,但是安装的时候会提示解析包错误。
2. 下载到/system或者/cache,文件创建不成功,好像是权限问题。请问我怎么才能在机身存储来完成自动更新功能,因为不能强迫别人去插一张SD才能用。我调用系统安装的代码:
String tPath = downLoadFilePath;
File mainFile = new File(tPath);
if (mainFile.exists()) {
Uri data = Uri.fromFile(mainFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(data,
"application/vnd.android.package-archive");
startActivity(intent);
}下载文件后存储:
File tFile = new File(saveFilePath); //saveFilePath可以是SD卡耶可以是机身存储。
if(tFile.exists())
{
tFile.delete();
}
if(!tFile.exists())
{
FileOutputStream fos = new FileOutputStream(tFile);
fos.write(saveBuffer);
fos.flush();
fos.close();
if(tFile.exists())
{
return tFile;
}
}求解答,谢谢了。
解决方案 »
- 关于服务端与客户端之间的数据传递问题,加上eclipse如何同时debug服务端与客户端?
- 新手求助啊,各位大神!!!!
- Android 中图片显示问题
- android下载源码出错,求大神帮助
- 地图在模拟器上能正常显示,在手机上显示不了
- 在tablelayout的tablerow 外层 有个LinearLayout 为什么添加到tablelayout中无法显示tablerow中的每一个项?
- Camera.open()返回一直为null是为什么
- eclipse连接手机后,DDMS不显示任何活动应用是什么原因
- LinearLayout.setLayoutParams(...,...)和FrameLayout.setLayoutParams(...,...)的正常和错误
- 求助,eclipse项目转到androidstudio上,报错,求大神帮忙
- Android button 如何通过代码获取宽度
- Android 编程时出现build path错误~~新手求解
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
默认建立的文件是存在机身里的吧?
例如用SharedPreferences创建一个配置文件,会生成一个xml文件,这个文件默认是存在机身里的吧?
那这是怎么存储的?能不能有类似的做法?
Parent directory of file is not writable
而在安装之前系统会把该程序给删除,安装的时候,一方面系统的安装程序 APP_id 跟下载的apk文件的不一样,另一方面下载的apk文件的权限也是只读。所以就会出现无法解析文件。解决方法,
1.系统以及原来程序的 APP_id 我们是没有办法更改的,但我们可以去更改下载的文件的权限,给它设置成可读可写可操作的,就可以了。
2.就直接给下载到sdcard上,没有sdcard的话,就不让下载。其他的方法待研究。
看来有sd卡就下载到sd卡上,没有sd卡再执行方法1的操作比较好。
String command = "chmod 777 " + tFile.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
runtime.exec(command);
通常是这一句。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission android:name="android.permission.READ_OWNER_DATA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_OWNER_DATA"></uses-permission>希望可以在/data/data/PKG NAME/files 路径下创建并写入文件我用的是JNI+C++ 代码如下
FILE* file = fopen("/data/data/com.test.w4e/files/Hello.txt","rw");
if (file != NULL)
{
LOGI("ready to write file");
fputs("HELLO WORLD!\n", file);
fflush(file);
fclose(file);
}但是 目前只能实现对已存在文件进行读写 如果文件不存在的话 是不能创建的求指点啊