2012-09-26 53 views
4

在我的Android應用程序中,我想檢查應用程序安裝的來源。 我看着Android文檔,發現下面的API爲PackageManager類的一部分:getInstallerPackageName返回null

abstract String getInstallerPackageName(String packageName) 

檢索安裝包中的應用程序的包名。

然後我用下面的代碼在MyActivity的onCreate方法:

if(Build.VERSION.SDK_INT >= 11) 
{ 
    PackageManager myapp= this.getPackageManager(); 
    String installer = myapp.getInstallerPackageName("com.MyPackage"); 
    if(installer == null) 
    { 
     Toast.makeText(getApplicationContext(), MyActivity.this.getString(R.string.invalidsource), Toast.LENGTH_SHORT).show(); 
     MyActivity.this.finish(); 
    } 
} 

但是看起來這個API在真實設備上返回null

請讓我知道,如果我們有任何其他方式獲取應用程序安裝的來源。

回答

5

關於你的問題,應用程序是如何安裝到設備上的?通過「adb安裝」它將是空的。

使用以下內容,您應該可以將其覆蓋爲任何您想要進行測試的目的。

pm install -i installername com.example.package 

GooglePlay的值應爲com.google.android.feedback。我不確定其他應用商店使用什麼值。

+0

另一種可能的方式是使用「setInstallerPackageName」,對不對?這裏有一個鏈接:http://developer.android.com/reference/android/content/pm/PackageManager.html#setInstallerPackageName(java.lang.String,java.lang.String)。我想知道需要哪個權限。 –

+0

要注意您提到的方法說_「如果installerPackageName沒有使用與調用應用程序相同的證書進行簽名,將會拋出SecurityException。」_即,您無法假裝已從GooglePlay安裝應用程序 – Dori

2

我用模擬器和真實設備測試了這個API方法。 大部分時間,它返回null。從Google Play官方安裝應用後,僅返回com.android.vending

隨着中國本地應用市場的應用,如AppChinawandoujia,null被返回。

代碼段,日誌被張貼在這裏:Github Gist

5

,如果你想測試這個方式是使用

亞行推「test.apk」存儲設備上的APK「/ SD卡/下載亞行殼‘打在了終端輸入」

然後通過鍵入到亞行殼’,然後安裝使用以下命令

點安裝-i「installernameyouwant」 /sdcard/Download/test.apk

安裝在上面的方法)的應用程序調用getInstallerPackageName(返回時您在上面的命令給

學分安裝程序名稱用於「pm安裝」命令的@mattmook。