【问题标题】:Delete Apk after app installation应用安装后删除 Apk
【发布时间】:2014-05-05 09:36:10
【问题描述】:

我正在开发一个应用程序,我必须在其中限制用户个人共享 apk。可以下载,但不得通过蓝牙等个人分享应用(apk)。

我搜索并阅读了很多关于同一问题的信息,但没有找到完整的答案。我已经尝试过以下方法。

  1. How to get the file *.apk location in Android device

  2. Download, Installing and Delete .apk file on android device programmatically from a website other than marketplace

我从上面了解到的是,执行此操作的简单方法是在安装应用程序后从用户设备中删除 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 来注册它。

谁能指导我下一步是什么?如果我完全在错误的土地上,那么请帮助我实现上述目标?

任何帮助将不胜感激。 :)

【问题讨论】:

  • the IntentFilter I should useandroid.intent.action.PACKAGE_ADDED。缺少什么?
  • 我已经添加了这个,并认为这会起作用,但它没有。如果有帮助,我会放上我的整个代码。
  • 输入完整的清单(使用广播接收器注册),并添加更多关于接收 PACKAGE_ADDED 广播的上下文(完整的 onReceive 方法)
  • 检查这个link..可能对你有帮助..

标签: broadcastreceiver apk android-broadcast android


【解决方案1】:

在更高版本的 Android 上,某些(全部?)广播在手动打开至少一次之前不会发送到应用。这是一项无法规避的安全功能。

【讨论】:

  • 我有点忙,所以没有尝试任何答案。感谢您的回答和帮助。以后肯定会尝试的。恭喜你的赏金。你应得的:)
【解决方案2】:

据我所知,无法收听安装完成广播事件。 Android Api 有广播动作:“ACTION_PACKAGE_ADDED”但是新安装的包没有收到这个广播。来源:Here

我的建议是检查您的第一个启动器活动并删除 apk。

【讨论】:

    【解决方案3】:

    您可以在此处使用 Android 应用许可服务。 参考http://developer.android.com/google/play/licensing/index.html 和这里的实现http://developer.android.com/google/play/licensing/adding-licensing.html

    这将确保无法使用市场上可用的任何应用程序共享 apk(使其受到保护)。

    【讨论】:

      【解决方案4】:

      抱歉英语不好。

      这里我的解决方案不是实际代码:

      1) 在您的设备中安装任何新应用程序时设置您的广播接收器。

      2) 当你的广播接收器被调用时,你在 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;
          }
      }
      

      使用此方法或任何 如果你得到 true 意味着你的应用程序正在安装

      3) 如果你从 isPackageInstalled("com.download.app", context) 方法中得到 true 那时从您的 SD 卡或设备中的任何位置删除 apk 文件

      如果你更清楚我会解释。

      【讨论】:

        【解决方案5】:

        我的想法是在应用程序第一次运行时创建一个文件夹。如果它不存在,删除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();
            }
        

        【讨论】:

          【解决方案6】:

          您还可以使用 HockeyApp 产品并使用他们提供的 Android 应用程序进行分发,以及启用“限制”功能。我很确定它可以满足您的需要,而无需编写额外的代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-18
            • 1970-01-01
            • 1970-01-01
            • 2016-05-10
            • 2021-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多