在卸载应用程序时从sdcard删除文件

时间:2014-02-25 16:01:29

标签: android qt file broadcastreceiver android-sdcard

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

 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方法 在这个方法中,我正在定义这样的bradcast接收器

  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>

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在程序包卸载时不会调用您的活动onDestroy()。此外,在PackageManager删除您的应用程序时,PACKAGE_REMOVED BroadcastReceiver已经......好了..已删除。

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

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

答案 2 :(得分:0)

您可以通过以下方式获取自己应用的卸载事件。

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

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

获得卸载事件后,您可以使用本机代码删除sdcard上的文件。

答案 3 :(得分:-2)

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