搜尋此網誌

2021年4月14日 星期三

Android 的 Intent 請求其它 App 幫忙

 緣起:


    Android 的書最近看到一半了,開心 ~~ 但在 Intent 的範例上遇到不少問題,被它搞了好久,卡了好幾天才成功 (不過最後一個卡關的地方超白痴的就是) ,記錄一下。



範例流程:


    先講講書本上的教學。一開始要讓 App 能取得手機的外部儲存空間存取權限,這邊沒什麼問題,照著做就能成功了,只是有很多類別跟方法我都不認識。

在 AndroidManifest.xml 下加上 <user-permission ... 這段

    然後加上下面這兩個 method。

要求取得讀取權限,要在 onCreate 那邊呼叫

這個是取得權限後會做的事,顯示個通知。

    這樣程式在執行時,如果發現它沒有讀取外部儲存空間的權限,他就會詢問使用者。

像這樣


取得成功後

    再來要把我們的 mp3 跟 png 放到虛擬手機上,它在這邊是使用 adb 工具,使用後,就能像在 Linux 上用指令操作手機,用 mv 指令把你電腦上的音樂檔與圖片檔放到虛擬手機的儲存空間裡。不過我在這裡遇到 permission deny 的問題,所以就想說,換把程式放到我的實體手機上跑好了。

    接著,我們要讓被請求幫忙的程式也能有權限存取我們的音樂跟圖片檔,必需要使用 Fileprovider 來提供檔案的路徑,我也不是很懂啦,反正就照做。

    首先要在 res 資料夾下新增一個 paths 的資源檔。

它的檔名叫 provide_paths.xml ,external-path 就是要分享的路徑。

    PS:我前面說的最後一個卡關的地方,就是在這裡,<external-path> 不知為啥寫成 <external-file-path> .... ,然後沒注意到,程式就一直出錯。

    然後在 AndroidManifest.xml 下,<application> 標籤內新增 Fileprovider。


    接著 coding ,主程式的部份就三個按鈕,各自觸發一種事件。

Intent 請求開網頁

Intent 請求開音樂

    Intent 開圖片跟開音樂很像,所以我就不再貼了,書本內的整個教學大概就這樣。


問題:


    我有把 song.mp3 跟 image.png 都放到我的手機記憶體上,不過程式在跑的時候,點 "開啟網頁" 的 button 沒什麼問題,可是點了 "播放MP3" 跟 "顯示圖片" 的 button 後,它無法成功,其它程式無法開啟音樂檔或圖片檔。

    一直看不出是哪出了問題,後來想到,有沒有可能是因為檔案不存在哪 ? 我記得 File 類別可以用 exists 來確定檔案是否存在,可以把結果放在一個 TextView 上看看。所以,我 MP3 的 button 事件就先改成下面這樣來測試。


找不到檔案 ???


Android 的外部儲存:


    我的手機有插 SD 卡,所以用 usb 線連到電腦後,會看到兩個空間,我想說,外部儲存空間指的就是 SD 卡吧,所以就把資料都放在 SD 卡的目錄下。


    可是 app 找不到東西ㄟ ,還是我把路徑也印出來看看 ? 看看那個 Environment.getExternalStorageDirectory.getPath() 得到的值是什麼。


    嗯....,是 /storage/emulated/0 的位置,我還是不太明白是在哪 XD ,不過,把這東西丟到 google 上找後,到是看到這篇文章

    哦~~~ 所以,那一個 /storage/emulated/0 指的就是那個 "內部共用儲存空間",雖然它是手機本身就有的空間,但 android 還是會把它給看成外部的儲存空間。


    我列印出 /storage/emulated/0 下的內容,果然,真的就是 "內部共用儲存空間" 。

一樣改 button 的事件。

有了~~ 檔案都找得到。

真的成功了~~ 可以放音樂。


沒有留言:

張貼留言