2012-06-21 61 views
2

發送作爲附件我用下面的代碼創建的SQLite數據庫:文件沒有得到通過電子郵件

context.openOrCreateDatabase(dbName, Context.MODE_WORLD_READABLE, null); 

並試圖將其通過電子郵件使用下面的代碼作爲附件發送:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND) 
     .setType("message/rfc822") 
     .putExtra(android.content.Intent.EXTRA_STREAM, 
       Uri.fromFile(getDatabasePath(dbName))); 
startActivity(Intent.createChooser(emailIntent, null)); 

這會打開附件圖標的GMail撰寫活動。但收件人沒有收到附件。

這已是asked before。但它看起來像沒有解決方案,而不是將數據庫文件複製到SD卡。

那麼我的問題是:如果像GMail這樣的其他應用程序無法讀取文件,MODE_WORLD_READABLE標誌的用法是什麼?

+0

使用電子郵件發送數據庫似乎並不簡單。使用一些序列化方法..無論如何,在Android應用程序是沙箱,這可能是問題的原因。當使用附件或其他類型的共享方法時,您必須確保該文件位於沙盒之外。 – ApriOri

+0

@Erb如果文件被沙箱化,「MODE_WORLD_READABLE」標誌的用法是什麼? –

回答

0

比方說,我們有2個應用程序APP_1和Android上的文件系統APP_2 ,那些2個應用躺在/數據/數據/ APP_1和/數據/數據/ APP_2 其中APP_1是 「用戶」 APP_1

如果您在/數據/數據運行ls,你會看到這樣的內容: drwxr-X - X APP_1 APP_1 drwxr-X - X APP_2 APP_2

MODE_WORLD_READABLE相當於Unix命令,在+ R [文件] 但是,這不允許其他用戶/應用程序訪問該文件,因爲目錄權限不允許app_1訪問app_2文件夾中的文件。

事實上,app_1甚至無法使用ls/data/data來查看所有其他目錄的列表。 底線,MODE_WORLD_READBLE僅在處理像sdcard這樣的共享存儲上的文件時有用,而不是在每個應用程序正在運行的有囚禁的沙箱上處理。

我希望這些信息對您有所幫助。

+0

PS如果您想測試此行爲,並且您的設備/模擬器上有root用戶,則可以執行類似cd/data/data的操作,然後su app_1,然後嘗試訪問/ data/data/app_2上的另一個應用程序的文件 – ApriOri