ha-excited / BigNews

Android增量更新框架差分包升级

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

存储权限申请了,差分失败,从后台拿了查分包合并也失败了

ailoli1314 opened this issue · comments

private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
//请求状态码
private static int REQUEST_PERMISSION_CODE = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.guyurumian);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
        Log.e("quanxian","  1");
        //if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            Log.e("quanxian","  ");
        //}
}

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.back_iv:
        case R.id.back_tv:
            this.finish();
            break;
        case R.id.guanyu_dafen:
            new MyThread1().start();//创建并启动线程 差分
            break;
        case R.id.guanyu_banben:
            new MyThread2().start();//创建并启动线程 合并
            break;
        case R.id.guanyu_tiaokuan:
            Intent intent = new Intent(this, FuwuTiaokuan.class);
            startActivity(intent);
            break;
    }
}
public class MyThread1 extends Thread {//继承Thread类

    public void run() {
        //重写run方法
        /**
         * oldApkPath: 老安装包路径
         * newApkPath: 新安装包路径
         * patchPath: 升级/差分包路径(输出)
         * return: 成功返回 true,否则为 false。
         * 差分
         */
        String oldApkPath = getApplicationContext().getPackageResourcePath();
        File sdFile = Environment.getExternalStorageDirectory();
        String sdStrings = sdFile.getAbsolutePath();
        String sdString = getSystemFilePath(AboutRuMian.this);
        Log.e("sdString","="+sdString);
        boolean state=false;
        File file=new File(sdString + "/app-debug.apk");
        if(file.exists()){
            Log.e("文件"," 存在");
        }else{
            Log.e("文件"," 不存在");
        }
        Log.e("旧文件"," 地址="+oldApkPath);
        File file1=new File(oldApkPath);
        if(file1.exists()){
            Log.e("旧文件"," 存在");
        }else{
            Log.e("旧文件"," 不存在");
        }
        try{
            state=BigNews.diff(oldApkPath, sdString + "/app-debug.apk", sdStrings + "/patchPath.patch");
        }catch (Exception e){
            Log.e("差分失败"," ss0");
        }

        Log.e("state","="+state);
        Looper.prepare();
        Toast.makeText(AboutRuMian.this,"求差分包",Toast.LENGTH_SHORT).show();
        Looper.loop();
        if(state){
            Log.e("差分成功"," ss");
        }else{
            Log.e("差分失败"," ss");
        }
    }

}

private static String getSystemFilePath(Context context) {
    String cachePath;
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
            || !Environment.isExternalStorageRemovable()) {
        cachePath = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath();

// cachePath = context.getExternalCacheDir().getPath();//也可以这么写,只是返回的路径不一样,具体打log看
} else {
cachePath = context.getFilesDir().getAbsolutePath();
// cachePath = context.getCacheDir().getPath();//也可以这么写,只是返回的路径不一样,具体打log看
}
return cachePath;
}

public class MyThread2 extends Thread {//继承Thread类

    public void run() {
        //重写run方法
        /**
         * oldApkPath: 老安装包路径
         * newApkPath: 新安装包路径(输出)
         * patchPath: 升级/差分包路径
         * return: 成功返回 true,否则为 false。
         * 合并
         */
        String oldApkPath = getApplicationContext().getPackageResourcePath();
        File sdFile = Environment.getExternalStorageDirectory();
        //String sdString = sdFile.getAbsolutePath();
        String sdString = getSystemFilePath(AboutRuMian.this);

        File file=new File(sdString + "/old_new.patch");
        if(file.exists()){
            Log.e("文件"," 存在");
        }else{
            Log.e("文件"," 不存在");
        }
        boolean state=BigNews.make(oldApkPath, sdString + "/new1.apk", sdString + "/old_new.patch");
        Log.e("state"," ="+state);
        if(state){
            Log.e("合并成功"," s");
            File apkfile = new File(sdString+"/new1.apk");
            if (!apkfile.exists()) {
                return;
            }
            Intent i = new Intent(Intent.ACTION_VIEW);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 7.0+以上版本 //跳转安装apk
                Uri apkUri = getUriForFile(AboutRuMian.this,
                        AboutRuMian.this.getApplicationContext().getPackageName() + ".provider", apkfile);
                //与manifest中定义的provider中的authorities="com.xinchuang.buynow.fileprovider"保持一致
                i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                i.setDataAndType(apkUri, "application/vnd.android.package-archive");
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            } else {
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
                        "application/vnd.android.package-archive");
            }
            AboutRuMian.this.startActivity(i);
        }else{
            Log.e("合并失败"," ");
        }
    }

}


@Override
public void onRequestPermissionsResult(int requestCode,  String[] permissions,  int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            Log.e("guanyurumian", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
        }
    }
}

安卓萌新,请指教

如果这是个demo 方便的话可以把demo提交到你的仓库里 我下载运行来看看 谢谢你

在公司的项目里,
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.thoughtics.beauty-1/base.apk"],nativeLibraryDirectories=[/data/app/com.thoughtics.beauty-1/lib/arm, /data/app/com.thoughtics.beauty-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]] couldn't find "libbigNews.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:984)
at java.lang.System.loadLibrary(System.java:1554)
at ha.excited.BigNews.(BigNews.java:5)
at ha.excited.BigNews.diff(Native Method)
at com.thoughtics.beauty.activity.AboutRuMian$MyThread1.run(AboutRuMian.java:131)
用直接导入下载项目的方式报错了

你换方法3导入把 这种问题不是我这个代码的问题了

E/sdString: =/storage/emulated/0/Android/data/com.thoughtics.beauty/files/Pictures/app-debug.apk
E/文件: 存在
E/旧文件: 地址=/data/app/com.thoughtics.beauty-1/base.apk
E/旧文件: 存在
E/state: =false

路径是要用绝对路径吗,

我把demo中jni相关的配置在自己的项目里导入了,合并 差分终于返回ture了 ,但文件没有生成,怎么办呢

哭死,假的,差分 合并没有成功,我随便写个地址返回的也是ture

这么多人都ok,我还提供了demo ,就你不成功。
报错说的那么清楚,连so都没导入进去,都告诉你用第三种方法导入,你还说我这玩意假的。
我做这个库方便大家,又没收你钱,你弄不好还要说我这个有问题,你自己玩去吧。

我又没说你的东西是假的,我只是误以为我已经实现了,测试才发现有错误,都是假象,所以说是假的,

你把你出问题的地方 弄个demo 提交你自己仓库里 把链接贴这里 看看你是怎么搞的

你把你出问题的地方弄个demo提交你自己仓库里放在链接贴这里看看你是怎么搞的

您好大神,我这边把项目下载下来在本地无法运行啊,报SIMPLE: Error configuring,工程里也没有jni文件夹,没有看到so库。是不是这个原因啊