【问题标题】:Deleting file from sdcard on uninstalling app卸载应用程序时从 sdcard 中删除文件
【发布时间】:2014-02-25 16:01:28
【问题描述】:

我正在使用 qt 开发一个 Android 应用程序,并在该 qt 中集成了 Android 代码。使用 qt 我正在 sdcard 上创建一个文件,该文件在卸载应用程序时不会被删除。我正在尝试使用这两种方法删除该文件 1.方法

 public void deleteExternalStoragePrivateFile() {

   File file[] = Environment.getExternalStorageDirectory().listFiles();
   for(int i = 0; i< file.length; i++) {
   file[i].getAbsolutePath(); 
   Log.d("Listing files: ", file[i].getAbsolutePath());
   if (file[i].getAbsolutePath().equalsIgnoreCase("/mnt/sdcard/test.txt")) {
       file[i].delete();
       }
   }

} 并在我不知道调用此方法的正确位置的主要活动的 OnDestory 中调用此方法。

2 方法 在这种方法中,我正在定义这样的广播接收器

  public class PackageRemoval extends BroadcastReceiver 
 {
 @Override
 public void onReceive(Context context, Intent intent){
//this.context=context;
Uri data = intent.getData();
Log.d("hi", "Action: " + intent.getAction());
Log.d("hi", "The DATA: " + data);

String action=intent.getAction();

if(Intent.ACTION_PACKAGE_REMOVED.equalsIgnoreCase(action)){

    File file[] = Environment.getExternalStorageDirectory().listFiles();

    for(int i = 0; i< file.length; i++) {
    file[i].getAbsolutePath(); 
    Log.d("Listing files: ", file[i].getAbsolutePath());
    if (file[i].getAbsolutePath().equalsIgnoreCase("/mnt/sdcard/test.txt")) {
        file[i].delete();
    }
    }

}
}
}

我已经像这样在 Manifest 文件中添加了接收器

    <receiver android:name="com.example.test.PackageRemoval">
  <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
  </intent-filter>
</receiver>

但我似乎没有任何工作,也没有收到任何异常或错误......知道我错过了什么......我想很可能我正在正确调用这些方法或广播接收器

【问题讨论】:

    标签: android qt file broadcastreceiver android-sdcard


    【解决方案1】:

    当用户卸载你的应用时,你上面写的代码都不会运行,因为这些代码将不再存在。

    您应该做的是从 android.content.Context.getExternalFilesDir() 获取存储文件的正确位置。这样可以避免 sd 卡中的文件杂乱无章,并确保在用户卸载您的应用时清理这些文件。

    【讨论】:

    • 默认路径是/Android/data/packageName/fileName?我可以像使用 qt 那样从 Android 外部创建文件吗
    • 我不明白您所说的“Android 之外”是什么意思。您在上面发布的代码在我看来就像 Android 代码(有一个 Intent、一个 BroadcastReceiver、一个清单),那么您为什么不能只调用 Context.getExternalFilesDir() 而不是硬编码路径呢?
    【解决方案2】:

    您的 Activity 的 onDestroy() 在软件包卸载时不会被调用。此外,当 PackageManager 删除您的应用程序时,PACKAGE_REMOVED BroadcastReceiver 已经被...删除了。

    请将您的文件存储在getExternalFilesDir() 文件夹中,该文件夹在软件包卸载时被删除。

    您放置在该路径之外的任何内容都将保留。

    【讨论】:

    • 我猜默认路径是/Android/data/packageName/fileName?我可以像使用 qt 一样从 Android 外部创建文件吗
    • QT 如何在“Android 之外”运行?如果您的代码在同一个进程中执行,您可以使用伪私有外部目录做任何您喜欢的事情,并且在卸载时,PackageManager 将删除其中的任何文件。然而,从 Android 4.4 开始,这个目录是真正私有的,应该没有其他进程可以访问它。
    • 我的意思是我正在使用 qtcode 创建文件,所以不确定在哪里可以访问伪私有路径来保存它....你能告诉我这个的默认路径是什么
    • 你能把它从java传到qt吗?默认路径如上所述,但 Android 文档强烈建议不要硬编码默认路径,因为它可能会在不同的实现之间发生变化。
    • 我认为我可以做到,但我正在尝试使用此链接qt-project.org/doc/qt-4.8/…
    【解决方案3】:

    这是一种获取您自己应用的卸载事件的方法。

    在本机代码中使用“inotify”。例如:您可以使用 inotify_add_watch 来监控应用程序的数据缓存文件夹,例如 /data/data/your-package-name/cache。当您的应用程序被卸载时,您可以获得文件夹的删除事件。

    另一个关键点是 inotify 应该在与您自己的应用程序不同的进程中运行。您可以调用 fork() 来执行此操作。

    收到卸载事件后,您可以在本机代码中删除 sdcard 上的文件。

    【讨论】:

      【解决方案4】:

      尝试在删除应用之前运行此代码

      【讨论】:

        猜你喜欢
        • 2012-03-19
        • 2017-04-21
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多