参考博客:http://aswang.iteye.com/blog/1493552
使用android隐蔽api的方式,需在源码下编译:
package com.artion.install; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.IPackageInstallObserver; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class InstallDemoActivity extends Activity { private Button btn1=null; private Button btn2=null; private final int INSTALL_COMPLETE = 1; final static int SUCCEEDED = 1; final static int FAILED = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1=(Button) findViewById(R.id.btn1); btn2=(Button) findViewById(R.id.btn2); btn1.setOnClickListener(listener1); btn2.setOnClickListener(listener2); } private OnClickListener listener1=new OnClickListener() { @Override public void onClick(View v) { try { copyBigDataBase(ASSETS_NAME, DB_PATH + DB_NAME); Toast.makeText(getApplicationContext(), "Copy successfully", Toast.LENGTH_SHORT).show(); } catch (IOException e) { // TODO Auto-generated catch block Toast.makeText(getApplicationContext(), "Copy failedly", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } }; private OnClickListener listener2=new OnClickListener(){ public void onClick(View v) { String fileName = DB_PATH + DB_NAME;//Environment.getExternalStorageDirectory() + "/artion/HelloAndroid.apk"; Uri uri = Uri.fromFile(new File(fileName)); int installFlags = 0; PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo("com.artion.android.hello", PackageManager.GET_UNINSTALLED_PACKAGES); if(pi != null) { installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; } } catch (NameNotFoundException e) { } // String installerPackageName = getIntent().getStringExtra( // Intent.EXTRA_INSTALLER_PACKAGE_NAME); PackageInstallObserver observer = new PackageInstallObserver(); pm.installPackage(uri, observer, installFlags, "com.artion.android.hello"); } }; class PackageInstallObserver extends IPackageInstallObserver.Stub { public void packageInstalled(String packageName, int returnCode) { Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); msg.arg1 = returnCode; mHandler.sendMessage(msg); } }; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case INSTALL_COMPLETE: // Update the status text // Show the ok button System.out.println("INSTALL_COMPLETE"); int centerTextLabel; Drawable centerTextDrawable = null; if(msg.arg1 == SUCCEEDED) { System.out.println("install successfully SUCCEEDED"); Toast.makeText(getApplicationContext(), "Install successfully", Toast.LENGTH_SHORT).show(); } else { System.out.println("install failedly FAILEDLY"); Toast.makeText(getApplicationContext(), "Install failedly", Toast.LENGTH_SHORT).show(); } if (centerTextDrawable != null) {} break; default: break; } } }; private static String DB_PATH = android.os.Environment .getExternalStorageDirectory().getAbsolutePath() + "/artion/"; private static String DB_NAME = "artion.apk"; private static final int ASSETS_SUFFIX_BEGIN = 101; private static final int ASSETS_SUFFIX_END = 102; private static String ASSETS_NAME = "HelloAndroid.apk"; private void copyBigDataBase(String assertName, String outFileName) throws IOException { InputStream myInput; //String outFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outFileName); // for (int i = ASSETS_SUFFIX_BEGIN; i < ASSETS_SUFFIX_END + 1; i++) { // myInput = this.getAssets().open(ASSETS_NAME + "." + i); // byte[] buffer = new byte[1024]; // int length; // while ((length = myInput.read(buffer)) > 0) { // myOutput.write(buffer, 0, length); // } // myOutput.flush(); // myInput.close(); // } // myOutput.close(); myInput = this.getAssets().open(assertName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myInput.close(); myOutput.close(); } }
添加权限: <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.CLEAR_APP_CACHE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" /> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android静默安装
最新推荐文章于 2023-08-31 17:13:50 发布