android 已有apk 启动第三方程序

         学习android 已经差不多两个月了,最近做了一个很蛋疼的项目,为什么蛋疼?因为这是我的第一个稍微大一点的项目。到现在,也算是告一段落,之后就是不知道多少个版本的更新了,在这个项目中有一个启动第三方程序的工具箱模块,开始,我以为这个so seay ,然后,做着做着一晚上就过去了,下面谈谈我在这个模块遇到的问题。

         链接打开第三方,首先当然要知道你所链接应用的名字,当然,在android中,仅仅简单的apk名称是没有任何的意义的,我们要获取的是这个应用程序的包名,网上搜了一下,大多数的讲解都是获取android系统内所有的应用程序,而且看起来好复杂的样子。我现在手上已经有了要链接的应用的apk资源,所以我想,apk中可不可以获取到该程序的包名和入口activity呢?百度+思考,结果如下:

         

String archiveFilePath="sdcard/工程文件/cj.apk";//要连接的安装包路径
        PackageManager pm = getPackageManager();  	//获取系统的PackageManager 
        //获取指定该路径下的apk的包信息  通过这个类可以获取到指定的apk中AndroidManifest.xml中的信息
        PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);  
        if(info != null){
        	//ApplicationInfo   <application />这个标签不陌生吧
            ApplicationInfo appInfo = info.applicationInfo;  
            String packageName = appInfo.packageName;  //得到包名
            String version=info.versionName;       //得到版本信息     
            Toast.makeText(TTTT.this, "packageName:"+packageName+";version:"+version, Toast.LENGTH_LONG).show();
            Drawable icon = pm.getApplicationIcon(appInfo);//得到图标信息
            ActivityInfo[] af = info.activities;
            String aa = af[0].name;
            Toast.makeText(getApplicationContext(), aa, 3000).show();
            Log.e("activity", aa);
            Log.e("packagename", packageName);
            
            Bitmap bitmap = drawableToBitmap(icon);
            try {
		<span style="white-space:pre">	</span>savebitMapToSDCard(bitmap, "/images/apks/", "cj.jpg");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    这里 我获取到了包名,当然,还有所有的activity的名称,已经图标啊!版本号啊等等,我以为这样就好了,万事大吉了,然而,事实上,我千辛万苦的链接了七个外部应用程序之后,实验一番的时候发现,竟然还有两个链接不上,这是什么原因呢?我自己的看了一次代码,并对比着自己的androidManifest.xml看,发现好像就是这么回事啊!但是不能打开是什么原因呢?不能打开当然是取到的activity并不是该程序的入口activity,于是我debug了一下,以最笨的方式(去ActivityInf[] af中找出前几个activity)一个个的实验,终于,我总算是找到了程序的入口了。

          下面是我获取到的包名和入口activity之后跳转的代码,一并奉上。

try{
	 ComponentName com = new ComponentName(list.get(position).getApkpackage(), list.get(position).getApkurl());
	 Intent intent = new Intent();   
	intent.setComponent(com);<span style="font-family: Arial, Helvetica, sans-serif;">//设置部件</span>
	 startActivity(intent);
}catch(Exception ex){
	Toast.makeText(getApplicationContext(), "找不到"+list.get(position).getApkname()+",请先下载安装!", 1000).show();
}

PS:

drawableToBitmap ()、savebitMapToSDCard()方法是我将drawable转存到sd卡中的方法,

但是遇到了有问题,所以采用最笨的方法,解压apk。

list中是我封装的要链接的程序的一些信息,

getApkpackage()是获取包名,

getApkurl()是获取入口方法的路径,

getApkname()是应用程序的名称。


 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值