仿QQ獲取手機中的APK并分享的實現 [復制鏈接]

2017-8-21 10:18
AlonMessi 閱讀:2680 評論:8 贊:6
Tag:  

前幾天看到同事里有一個界面絢麗的應用,覺得有點意思,就讓他把APK發給我,我想反編譯看看里面的代碼。結果,這哥們在手機里找了好一陣子,最后給我說:手機沒有root,找不到APK文件在哪里。我再讓他試試其他機子,結果都差不多:要不然找起來很麻煩,要不然根本都找不到。這時,測試的妹子說:手機QQ有這個功能。我打開手機QQ一看,果然有,平時都沒有注意到啊。

這個功能點稍作總結:

1. 每個item包括:應用的icon,名字,安裝文件的大小,最后更新時間

2. 點擊item分享其對應的APK文件

看到這里,心里怪癢癢的,我們也能做這么個類似的東西么?

能的!必須能!否則在測試的妹子面前怎么能抬起頭!?

我們先獲取手機中已經安裝的應用:

List packageInfoList = mPackageManager.getInstalledPackages(0);

這些應用已經都躺在這里了,我們現在就一步一步地來找出每個應用的相關信息。


(1) 獲取應用的名稱

public String getApplicationName(
   String packageName,PackageManager packageManager) {    
   String applicationName=null;    
   try {        
       ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);        applicationName = (String) packageManager.getApplicationLabel(applicationInfo);    } catch (PackageManager.NameNotFoundException e) {    }    
   return applicationName; }

嗯哼,這個不難,剛上路的小司機也可以輕松的搞定。


(2) 獲取應用的icon

應用的名字我們容易獲得,那它的icon又在哪里呢?

既然獲得應用名字用的是:

packageManager.getApplicationLabel(applicationInfo);

那么是不是有類似的getApplicationIcon方法呢?趕緊試著敲一下代碼,AS提示果然有我們想要的東西:

packageManager.getApplicationIcon(ApplicationInfo info);

嗯哼,真愉快,我們猜對啦。把代碼運行起來瞅瞅,我的華為手機沒有問題。換個三星試試,也對呢;再用HTC跑跑,獲取到的居然是個小綠人——系統默認的圖標!再從測試妹子那里拿個小米過來,一樣啊,沒有正確獲取到應用對應的圖標。


看來想通過PackageManager獲取應用的Icon是不行了,那就換個角度從PackageInfo入手試試,看到一個字段:

public ApplicationInfo applicationInfo;

官方文檔的解釋是: Information collected from the application。也就是說這個字段包含了App的眾多信息。所以,接著看ApplicationInfo里面有啥東西,掃了一眼,看到一個東西:

public Drawable loadIcon(PackageManager pm) {    
   return pm.loadItemIcon(this, getApplicationInfo()); }

利用該方法才可以避免在某些機型上無法獲取應用的icon的bug。手邊的機子試了一遍,都沒問題。這個小問題解決了,就接著往下走。


(3) 獲取應用的最后更新時間

這個也挺容易的,PackageInfo中有相應的字段:

public long lastUpdateTime;

當然這個值是個毫秒值,需要利用SimpleDateFormat將其轉換成項目需要的日期格式。


有些情況下還需要獲取應用的第一次安裝時間,PackageInfo中也有相應的字段:

public long firstInstallTime;

 同理,也需要對其進行格式化。


(4) 獲取Apk文件大小

要獲取Apk文件大小,首先得找到Apk文件。就像我想周末和妹子去逛街,前提是我得有個妹子啊(打住,不說了,眼淚滴到鍵盤上了)


但是它到底在哪里呢?幻想著利用PackageManager是不行的,它根本沒有類似于getApplicationApk( )的方法。


那怎么辦呢?喔,還記得前面提到的PackageInfo中的ApplicationInfo字段么?我們繼續去里面找,看看有沒有啥收獲,在源碼501行發現一個字段:

public String sourceDir;

官方文檔是這么描述的:Full path to the base APK for this application。嗯哼,bingo!找到了就是它,它代表了APK文件的完整路徑。文件路徑已經拿到了,啥都好辦了(就像知道了妹子住哪里,就可以........)

File apkFile = new File(packageInfo.applicationInfo.sourceDir);
int size = apkFile.length() / 1024 / 1024;

我們將該路徑封裝成一個文件,再獲取它的大小即可。在此處將文件大小轉換成了MB單位,比如豌豆莢的APK文件為6.46MB。


好了,想要的東西我們都找到了,我們用一個ListView把每個APK的相關信息作為item展示出來就行了。有個小問題請注意:獲取手機中APK信息,這是一個耗時的過程,所以我們要在子線程中來做這個事情。

看看做出來的效果:

我們接著實現點擊item分享Apk文件:

private class ItemClickListenerImpl implements 
AdapterView.OnItemClickListener{        
   @Override    public void onItemClick(AdapterView parent,
View view, int position, long id) {            
       File apkFile = mAppInfoList.get(position).getApkFile();
       Intent intent = new Intent();        intent.setAction(Intent.ACTION_SEND);        intent.setType("*/*");        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(apkFile));        startActivity(intent);    } }

在此處Apk文件放到intent中再調用系統自帶的分享功能即可。


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(8)
BeatBeat 2017-8-21 10:40
厲害了
回復
一生呵護你 2017-8-21 14:10
養兵千日用兵一時 這個不久將會用到 哈哈 多謝  
回復
權小陽 2017-8-21 14:28
贊~
回復
飛仙2016 2017-8-21 14:51
mark
回復
戈英禎 2017-8-22 08:48
不錯!早就用QQ的分享應用,但是不知如何實現!
回復
伊勢遼之助 2017-8-22 10:02
贊一個
回復
zyaym88 2017-8-23 15:23
作者很幽默啊!
回復
lpslpslps 2017-8-31 10:17
似乎一些應用安裝包被清理了。他還是能給別人發送一個apk。這個是怎么實現呢。比較好奇
回復
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

阿拉斯加垂钓APP下载
申城棋牌2.0手机版 足球预测网 皇冠比分 微乐吉林长春麻将官方下载 福建省11选5的走 河南郑州麻将朋友局 河北福彩排七开奖结果 快乐双彩全部开奖结果 平码计算6肖公式规律 南京麻将微信群2019 贵州11选5中奖规则 什么股票配资 湖北11选5中奖规则 手机挂机项目 吉林长春麻将吉祥棋牌 快乐10分开奖结果500w 河南十一选五