xushxbigbear微信 2013-05-21
android应用后台安装,静默安装的代码实现方法
http://hi.baidu.com/6936995/blog/item/eca4436387a80d7b0d33fa31.html
首先,你要有linux环境或其他可以mmm交叉编译的环境,因为这个用到的是隐藏api,SDK中没有的,ecilipse里面会提示包不存在,但交叉编译可以,如果你不知道mmm编译,请return。
代码如下:
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.content.Intent;
importandroid.content.pm.PackageInfo;
importandroid.content.pm.PackageManager;
importandroid.content.pm.PackageManager.NameNotFoundException;
importandroid.content.pm.IPackageInstallObserver;
importandroid.content.res.Resources;
importandroid.graphics.drawable.Drawable;
importandroid.net.Uri;
importandroid.os.Environment;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.ProgressBar;
importandroid.widget.TextView;
publicclassInstallActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
privateButtonbtn2=null;
privatefinalintINSTALL_COMPLETE=1;
finalstaticintSUCCEEDED=1;
finalstaticintFAILED=0;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn=(Button)findViewById(R.id.btn2);
btn2.setOnClickListener(listener2);
}
privateOnClickListenerlistener2=newOnClickListener(){
publicvoidonClick(Viewv){
StringfileName=Environment.getExternalStorageDirectory()+"/baidu/"+"UC.apk";
Uriuri=Uri.fromFile(newFile(fileName));
intinstallFlags=0;
PackageManagerpm=getPackageManager();
try{
PackageInfopi=pm.getPackageInfo("com.uc.browser",
PackageManager.GET_UNINSTALLED_PACKAGES);
if(pi!=null){
installFlags|=PackageManager.INSTALL_REPLACE_EXISTING;
}
}catch(NameNotFoundExceptione){
}
//StringinstallerPackageName=getIntent().getStringExtra(
//Intent.EXTRA_INSTALLER_PACKAGE_NAME);
PackageInstallObserverobserver=newPackageInstallObserver();
pm.installPackage(uri,observer,installFlags,"com.uc.browser");
}
};
classPackageInstallObserverextendsIPackageInstallObserver.Stub{
publicvoidpackageInstalled(StringpackageName,intreturnCode){
Messagemsg=mHandler.obtainMessage(INSTALL_COMPLETE);
msg.arg1=returnCode;
mHandler.sendMessage(msg);
}
};
privateHandlermHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseINSTALL_COMPLETE:
//Updatethestatustext
//Showtheokbutton
intcenterTextLabel;
DrawablecenterTextDrawable=null;
if(msg.arg1==SUCCEEDED){
}else{}
if(centerTextDrawable!=null){}
break;
default:
break;
}
}
};
}
重点是要实现一个这个类PackageInstallObserver,另外要注意importandroid.content.pm.……的那些包一定要导入。android.mk文件如下
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE_TAGS:=user
LOCAL_SRC_FILES:=$(callall-subdir-java-files)
LOCAL_PACKAGE_NAME:=InstallActivity
LOCAL_CERTIFICATE:=platform
include$(BUILD_PACKAGE)
重点是LOCAL_CERTIFICATE:=platform要对
另外编译的时候有可能会报R.java类重复错误,把你工程下gen文件夹删除即可,不会影响编译,传说中会在别的地方自动生成^……
作为一个新手,研究了四天无果,网上苦苦追寻无果,最后还是再前辈的带领下看系统安装源代码得来。看来要学好android还是要会看源代码。卷毛大帝。
这个在2.1上编译通过可以用,后台安装可以实现,后台卸载也可以实现,可以和安卓市场一样了。希望大家不要用这个功能搞图谋不轨的事情。
现在把工程和apk传上来大家看看,这种方法看来也不是适用于每一个系统,android系统太不统一了,只能这样了。