我正在开发一个应用,我必须限制用户亲自分享apk。可以下载它但不应该允许通过蓝牙等个人分享App(apk)。
我搜索并阅读了很多同样的问题,但没有找到完整的答案。我试过以下。
我从上面了解到,执行此操作的简单方法是在安装应用程序后从用户设备中删除apk文件。 (我也知道用户可以通过root访问再次生成这个apk,但这很好,至少我可以限制不是全部而是很多)。
现在我尝试了,我正在注册一个广播接收器,并在我的onReceive()
方法中,我有以下内容,
PackageManager pm = getPackageManager();
for (ApplicationInfo app : pm.getInstalledApplications(0)) {
if (myPackage.equalsIgnoreCase(app.packageName)) {
apkPath = app.sourceDir;
break;
}
}
Log.d("Package", myPackage + " - APK - " + apkPath);
if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard, apkPath);
file.delete();
}
但这没有任何作用,因为我不知道我应该用来注册它的IntentFilter。
任何人都能指导我下一步是什么吗?如果我完全在错误的土地上,那么帮助我实现上述目标?
任何帮助将不胜感激。 :)
答案 0 :(得分:2)
在Android的更高版本中,某些(全部?)广播不会被发送到应用,直到手动打开至少一次为止。这是一项无法规避的安全功能。
答案 1 :(得分:2)
据我所知,无法收听安装完整的广播事件。具有广播操作的Android Api:“ACTION_PACKAGE_ADDED”但是新安装的包不接收此广播。资料来源:Here
我的建议是检查你的第一个启动器活动并删除apk。
答案 2 :(得分:2)
您可以在此处使用Android App许可服务。 请参阅http://developer.android.com/google/play/licensing/index.html以及此处的http://developer.android.com/google/play/licensing/adding-licensing.html。
这将确保使用市场上的任何应用程序无法共享apk(使其受到保护)。
答案 3 :(得分:1)
抱歉英文不好。
这里我的解决方案不是实际代码:
1)在您的设备中安装任何新应用程序时设置您的broadcastreciver。
2)当你的broadcastreciver被调用时,你在onRecive()方法中编写代码 检查您的应用包是否安装
private boolean isPackageInstalled(String packagename, Context context) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
使用此方法或任何方法 如果你得到真的意味着你的应用程序是安装
3)如果你从isPackageInstalled(" com.download.app",context)方法得到了真实的话 那个时候从SD卡中删除apk文件或设备中的任何插件
如果你更加澄清,我会解释。
答案 4 :(得分:0)
我使用了第一次运行应用程序时创建文件夹的想法。如果它不存在,请删除apk。如果文件夹存在,那么apk已被删除。 如果应用程序未安装,该文件夹将自行删除。
public static String link = Environment.getExternalStorageDirectory()
.getPath() + "/Android/data/YourAppPackageName/";
//check if its running for the first time
File f = new File(link);
if (f.exists()) {
File f1 = new File("/data/app/YourAppPackageName.apk")
if(f1.exists()){f1.delete();}
}
else {
f.mkdirs();
}
答案 5 :(得分:0)
您还可以使用HockeyApp产品并使用他们提供的Android应用程序进行分发,并启用“限制”功能。我很确定无需编写额外的代码就可以满足您的需求。