2014-02-25 63 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卡上的文件。

相關問題