我正在使用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>
但我似乎没有任何工作,也没有得到任何异常或错误...任何想法,我错过了..我猜我最有可能正在调用这些方法或正确广播接收器
答案 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)
尝试在删除应用之前运行此代码