添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
发财的杨桃  ·  你不知道的Electron ...·  2 年前    · 
踏实的洋葱  ·  grep 去除匹配内容 ...·  2 年前    · 
善良的牙膏  ·  window.scroll无效、window ...·  2 年前    · 

卸载应用程序时从SD卡中删除文件

1 人关注

我正在使用qt开发一个Android应用,并在qt中集成了Android代码。使用qt,我在SD卡上创建了一个文件,但在卸载应用时却没有被删除。我试图用以下两种方法来删除该文件 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中调用这个方法,我不知道调用这个方法的正确位置。

在这个方法中,我是这样定义博拉广播接收器的

  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();

我已经在清单文件中添加了接收器,如下所示

    <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
JNI_OnLoad
JNI_OnLoad
发布于 2014-02-26
4 个回答
marcone
marcone
发布于 2020-11-14
0 人赞同

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

你应该做的是,从android.content.Context.getExternalFilesDir()获取正确的位置来存储你的文件。这可以避免在sd卡上乱放文件,并确保这些文件在用户卸载你的应用程序时被清理掉。

默认路径是/Android/data/packageName/fileName? 我可以从Android外部创建文件吗,就像我用qt做的那样。
我不明白你说的 "Android之外 "是什么意思。你上面发布的代码在我看来是Android代码(有一个Intent,一个BroadcastReceiver,一个manifest),那么你为什么不能直接调用Context.getExternalFilesDir()而不是硬编码路径?
323go
323go
发布于 2020-11-14
0 人赞同

你的Activity的 onDestroy() 不会在包卸载时被调用。此外,当PackageManager移除你的应用程序时, PACKAGE_REMOVED 已经被移除。BroadcastReceiver已经被......嗯......移除。

取而代之的是,将你的文件存储在 getExternalFilesDir() 文件夹中,该文件夹 will 在软件包卸载时被删除。

你放在该路径之外的任何东西都将保留。

默认路径是/Android/data/packageName/fileName,我猜? 我可以从Android外部创建文件吗,就像我用qt做的那样。
QT是如何在 "Android之外 "运行的?如果你的代码是在同一个进程中执行的,你可以对伪私有的外部目录做任何事情,任何放置在那里的文件在卸载时都会被PackageManager删除。然而,从Android 4.4开始,这个目录是真正的私有目录,其他进程不应该能够访问它。
我的意思是,我正在使用qtcode创建文件,所以不知道我在哪里可以访问伪私有路径来保存它....,你能告诉我这个的默认路径是什么吗?
你能把它从java传到qt吗?默认路径和你上面说的一样,但Android文档强烈建议不要硬编码默认路径,因为它可能会在不同的实现中发生变化。
我认为我可以做到这一点,但我正在尝试使用这个链接 qt-project.org/doc/qt-4.8/…
aarontang
aarontang
发布于 2020-11-14
0 人赞同

这里有一个方法,你可以得到你自己的应用程序的卸载事件。

在本地代码中使用 "inotify"。比如说。你可以使用inotify_add_watch来监控你的应用程序的数据缓存文件夹,如/data/data/your-package-name/cache。当你的应用程序被卸载时,你可以获得该文件夹的删除事件。