android静默更新

本文转载自:http://www.2cto.com/kf/201503/381170.html

静默顾名思义就是静静的默默地,静默安装和静默卸载的意思也就是说在后台默默地安装和卸载。

最近的一个app应用分发的项目中app下载的模块,下载完成之后,用户可以通过这个app进行安装,为了提高用户的体验,我就加入了静默安装和卸载功能,然后还加入了使用am命令启动某个Activity。

这个项目中静默的方式实现代码如下:

首先判断是否有root权限,如果有利用静默方式,否则利用意图实现app安装和卸载操作。

ckage com.example.test;
 
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
 
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
 
/**
  * 描述: app安装操作             
  * @author 吴传龙                 
  * Email:andywuchuanlong@sina.cn 
  * QQ: 3026862225              
  * @version 创建时间: 2015年3月6日 下午3:51:14               
  * @version 最后修改时间:2015年3月6日 下午3:51:14     修改人:吴传龙     
  */
public class ApkController {
     /**
      * 描述: 安装
      * 修改人: 吴传龙                                             
      * 最后修改时间:2015年3月8日 下午9:07:50
      */
     public static boolean install(String apkPath,Context context){
         // 先判断手机是否有root权限
         if (hasRootPerssion()){
             // 有root权限,利用静默安装实现
             return clientInstall(apkPath);
         } else {
             // 没有root权限,利用意图进行安装
             File file = new File(apkPath);
             if (!file.exists())
                 return false ;
             Intent intent = new Intent();
             intent.setAction( "android.intent.action.VIEW" );
             intent.addCategory( "android.intent.category.DEFAULT" );
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive" );
             context.startActivity(intent);
             return true ;
         }
     }
     
     /**
      * 描述: 卸载
      * 修改人: 吴传龙                                             
      * 最后修改时间:2015年3月8日 下午9:07:50
      */
     public static boolean uninstall(String packageName,Context context){
         if (hasRootPerssion()){
             // 有root权限,利用静默卸载实现
             return clientUninstall(packageName);
         } else {
             Uri packageURI = Uri.parse( "package:" + packageName);
             Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,packageURI);
             uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(uninstallIntent);
             return true ;
         }
     }
     
     /**
      * 判断手机是否有root权限
      */
     private static boolean hasRootPerssion(){
         PrintWriter PrintWriter = null ;
         Process process = null ;
         try {
             process = Runtime.getRuntime().exec( "su" );
             PrintWriter = new PrintWriter(process.getOutputStream());
             PrintWriter.flush();
             PrintWriter.close();
             int value = process.waitFor(); 
             return returnResult(value);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if (process!= null ){
                 process.destroy();
             }
         }
         return false ;
     }
     
     /**
      * 静默安装
      */
     private static boolean clientInstall(String apkPath){
         PrintWriter PrintWriter = null ;
         Process process = null ;
         try {
             process = Runtime.getRuntime().exec( "su" );
             PrintWriter = new PrintWriter(process.getOutputStream());
             PrintWriter.println( "chmod 777 " +apkPath);
             PrintWriter.println( "export LD_LIBRARY_PATH=/vendor/lib:/system/lib" );
             PrintWriter.println( "pm install -r " +apkPath);
//          PrintWriter.println("exit");
             PrintWriter.flush();
             PrintWriter.close();
             int value = process.waitFor(); 
             return returnResult(value);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if (process!= null ){
                 process.destroy();
             }
         }
         return false ;
     }
     
     /**
      * 静默卸载
      */
     private static boolean clientUninstall(String packageName){
         PrintWriter PrintWriter = null ;
         Process process = null ;
         try {
             process = Runtime.getRuntime().exec( "su" );
             PrintWriter = new PrintWriter(process.getOutputStream());
             PrintWriter.println( "LD_LIBRARY_PATH=/vendor/lib:/system/lib " );
             PrintWriter.println( "pm uninstall " +packageName);
             PrintWriter.flush();
             PrintWriter.close();
             int value = process.waitFor(); 
             return returnResult(value);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if (process!= null ){
                 process.destroy();
             }
         }
         return false ;
     }
     
     /**
      * 启动app
      * com.exmaple.client/.MainActivity
      * com.exmaple.client/com.exmaple.client.MainActivity
      */
     public static boolean startApp(String packageName,String activityName){
         boolean isSuccess = false ;
         String cmd = "am start -n " + packageName + "/" + activityName + " \n" ;
         Process process = null ;
         try {
            process = Runtime.getRuntime().exec(cmd);
            int value = process.waitFor(); 
            return returnResult(value);
         } catch (Exception e) {
           e.printStackTrace();
         } finally {
             if (process!= null ){
                 process.destroy();
             }
         }
         return isSuccess;
     }
     
     
     private static boolean returnResult( int value){
         // 代表成功 
         if (value == 0 ) {
             return true ;
         } else if (value == 1 ) { // 失败
             return false ;
         } else { // 未知情况
             return false ;
        
     }









/**
  * 描述: MainActivity            
  * @author 吴传龙                 
  * Email:andywuchuanlong@sina.cn 
  * QQ: 3026862225              
  * @version 创建时间: 2015年3月9日 上午8:19:19               
  * @version 最后修改时间:2015年3月9日 上午8:19:19     修改人:吴传龙
  */
public class MainActivity extends Activity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }
 
     /**
      * 描述: 安装
      * @param          
      * 修改人: 吴传龙                                             
      * 最后修改时间:2015年3月9日 上午8:19:30
      */
     public void click1(View view){
         new Thread(){
             public void run() {
                 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/jniTest.apk" ;
                 if (ApkController.install(path, getApplicationContext())){
                     toast( "安裝成功" );
                 } else {
                     toast( "安裝失败" );
                 }
             };
         }.start();
     }
     
     /**
      * 描述: 卸载
      * @param          
      * 修改人: 吴传龙                                             
      * 最后修改时间:2015年3月9日 上午8:19:30
      */
     public void click2(View view){
         new Thread(){
             public void run() {
                 if (ApkController.uninstall( "com.example.jnitest" , getApplicationContext())){
                     toast( "卸載成功" );
                 } else {
                     toast( "卸載失败" );
                 }
             };
         }.start();
     }
     
     /**
      * 描述: 启动
      * @param          
      * 修改人: 吴传龙                                             
      * 最后修改时间:2015年3月9日 上午8:19:30
      */
     public void click3(View view){
         if (ApkController.startApp( "com.example.jnitest" , "com.example.jnitest.MainActivity" )) {
             toast( "啟動成功" );
         }
     }
     
     
     public void toast( final String text){
         runOnUiThread( new Runnable() {
             @Override
             public void run() {
                 Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();;
             }
         });
     }
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值