要做一个自动更新功能,我需要下载一个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;
}
}求解答,谢谢了。

解决方案 »

  1.   

    附权限列表
     <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"/>
      

  2.   

    <uses-permission android:name="android.permission.INTERNET"/>
      

  3.   

    <uses-permission android:name="android.permission.INTERNET"/> 
     
      

  4.   

    楼主能不能将log信息发出来看看呢?
      

  5.   

    这是个问题,关注。
    默认建立的文件是存在机身里的吧?
    例如用SharedPreferences创建一个配置文件,会生成一个xml文件,这个文件默认是存在机身里的吧?
    那这是怎么存储的?能不能有类似的做法?
      

  6.   


    Parent directory of file is not writable
      

  7.   

    是权限的问题,比如该程序的 APP_id 是 25 ,那么使用该程序下载的新的apk文件是属于 25 ,它的权限也只是可读。
    而在安装之前系统会把该程序给删除,安装的时候,一方面系统的安装程序 APP_id 跟下载的apk文件的不一样,另一方面下载的apk文件的权限也是只读。所以就会出现无法解析文件。解决方法,
    1.系统以及原来程序的 APP_id 我们是没有办法更改的,但我们可以去更改下载的文件的权限,给它设置成可读可写可操作的,就可以了。
    2.就直接给下载到sdcard上,没有sdcard的话,就不让下载。其他的方法待研究。
      

  8.   

    UP
    看来有sd卡就下载到sd卡上,没有sd卡再执行方法1的操作比较好。
      

  9.   

    解決了 多謝各位只能修改文件權限了。
    String command = "chmod 777 " + tFile.getAbsolutePath();
                Runtime runtime = Runtime.getRuntime(); 
                runtime.exec(command);
      

  10.   

    可是我不明白 當前APP怎麼會有權限去調用RUNTIME來修改權限呢...
      

  11.   

    <uses-permission android:name="android.permission.INTERNET"/>
    通常是这一句。
      

  12.   

    小白来请教一下楼主我添加了如下权限
    <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);
    }但是 目前只能实现对已存在文件进行读写  如果文件不存在的话 是不能创建的求指点啊
      

  13.   

    哥们,我现在运到和你一样的问题,但是我这只能获取apk的-rwxrexrwx权限,不能向apk上层文件夹那样获取drwxrexrwx这个最高权限,所以我现在apk下载后还老是报解析错误,急切求哥们帮助解决
      

  14.   

    我不知道我下载到本身这个安装包下面/data/data/xx.xx.xx/files下 ,启动系统安装这个apk时,是不是会先会把这个本省这个包下面的文件内容删除掉,我拷贝出来,再安装进去是可以的