2014-02-25 61 views
1

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

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的方法 在这种方法中,我定义boradcast接收这样

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> 

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

回答

0

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

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

+0

默认路径是/ Android/data/packageName/fileName?和我可以创建从外部Android文件,就像我正在用qt –

+0

我不明白你的意思是“外部Android”。你上面发布的代码看起来像我的Android代码(有一个Intent,一个BroadcastReceiver,一个manifest),那么为什么你不能调用Context.getExternalFilesDir()而不是硬编码路径? – marcone

0

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

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

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

+0

默认路径是/ Android/data/packageName/fileName我猜?和我可以从外部Android创建文件,就像我正在使用qt –

+0

QT如何在“Android之外”运行?如果您的代码在同一个进程中执行,您可以使用伪私有的外部目录来执行任何您喜欢的任何操作,并且放置在那里的任何文件在卸载时将被PackageManager删除。然而,从Android 4.4开始,这个目录是真正的私有的,没有其他进程能够访问它。 – 323go

+0

我的意思是我使用qtcode创建文件,所以不知道我可以在哪里访问伪私有路径来保存....你能告诉我什么是这个 –

0

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

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

另一个关键点是inotify应该从你自己的应用程序运行在一个独立的进程中。你可以调用fork()来做到这一点。

一旦你得到卸载事件,你可以删除你的本地代码在SD卡上的文件。

相关问题