2012-09-26 54 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。