我们在开发的过程中,可能需要频繁的安装卸载自己的程序,而如果按照android系统的卸载步骤将花费较多的时间,再加上最近看android的widget,所以写个这样的小程序,希望有所帮助,反正自个儿用着还挺方便的。 源码见附件。
在做这个小程序中,看到的一片较好的文章,推荐下:
http://www.ophonesdn.com/article/show/146
1.应用场景:对于我们自己开发的两个应用程序,一个应用程序的包名为 aa.bb.cc,软件名叫a,它的入口Activity为 aaActivity(入口activity就是在AndroidManifest.xml中标签——<action android:name="android.intent.action.MAIN" />所在的activity,说白了,就是打开应用程序,第一个显示的activity),另一个应用程序的包名为 xx.yy.zz,软件名叫x,它的入口Activity为 xxActivity。
网上的通用做法如下(这里我假设a中有一个Button,这个Button的onclick事件中的代码如下):
ComponentName componentName=new ComponentName("xx.yy.zz","xx.yy.zz.xxActivity");
Intent intent=new Intent();
intent.setComponent(componentName);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
这种方法对于调用我们自己写的应用程序没有问题,但是如果你想调用别人的应用程序(例如:你写了一个游戏管理的软件,需要管理很多游戏,但是游戏不是你写的,你是得不到入口activity的,你怎么办?),解决办法如下:
通过PackageManager可以得到PackageInfo,通过PackageInfo就可以得到你手机上安装的应用的包名(这个很简单,网上有的是,不赘述)。关键是下一步,代码如下(也是a应用中Button的onclick中的代码):
PackageManager packageManager = Start_RemoveSoftActivity.this.getPackageManager();
Intent intent=new Intent();
try {
intent =packageManager.getLaunchIntentForPackage("要调用应用的包名");
} catch (NameNotFoundException e) {
Log.i(TAG, e.toString());
}
startActivity(intent);
其中,"要调用应用的包名"为通过PackageInfo得到的想要启动的应用的包名。这样,我们就可以不知道别人应用源码的情况下,也可以调用别人的应用程序。
3.通过代码在应用中安装已有的APK
需要将apk拷贝至shared_prefs文件夹下
(Eclipse下工具栏window-->show view-->other-->Android-->File Explorer,
也许打开的File Explorer为空白,这个你肯定忘了先运行下面代码构成的工程。出现目录后找到data/data/工程包名/shared_prefs,ok)
public class APKTest extends Activity
{
private SharedPreferences metafer = null;
ApplicationInfo mAppInfo = null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//apk安装或卸载路径
String installPath = "/data/data/com.hyz/shared_prefs/matchmusic.apk";
//新建shared_prefs文件夹
mkShared_prefs();
//安装apk
installApk(installPath);
//卸载apk
dumpApk(installPath);
}
public void dumpApk(String path)
{
ApplicationInfo mAppInfo = null;
PackageManager pm = getApplicationContext().getPackageManager();
PackageInfo info = pm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
if(info != null)
{
mAppInfo = info.applicationInfo;
}
Uri uri = Uri.fromParts("package", mAppInfo.packageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);
}
public void installApk(String path)
{
Intent ret = new Intent();
ret.setDataAndType(Uri.fromFile(new File(path)),"application/vnd.android.package-archive");
ret.setAction(Intent.ACTION_VIEW);
startActivity(ret);
}
public void mkShared_prefs()
{
if (metafer == null)
{
// metafer = getSharedPreferences("Vdmc", 0);
metafer = PreferenceManager.getDefaultSharedPreferences(this);
}
SharedPreferences.Editor editor = metafer.edit();
//editor.putString("IMSI", "");
editor.commit();
}
}
public static void showInstalledAppDetails(Context context, String packageName) {
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
Uri uri = Uri.fromParts(SCHEME, packageName, null);
intent.setData(uri);
} else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
: APP_PKG_NAME_21);
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(APP_DETAILS_PACKAGE_NAME,
APP_DETAILS_CLASS_NAME);
intent.putExtra(appPkgName, packageName);
}
context.startActivity(intent);
}
private static final String SCHEME = "package";
/**
* 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
*/
private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
/**
* 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
*/
private static final String APP_PKG_NAME_22 = "pkg";
/**
* InstalledAppDetails所在包名
*/
private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
/**
* InstalledAppDetails类名
*/
private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
这是正确代码,主要是action问题