一、FileProvider
前幾天學習了如何分享文字、圖片、音樂或其他流文件,那么提供讓我們選擇文件的應用,比如圖庫不僅能查看圖片還能從其他應用跳轉到圖庫去挑選圖片然后返回選擇的結果,這是如何做的呢?官方提供了 FileProvider 來幫助我們完成。
1、Manifest中聲明
<application> 標簽中聲明 <provider>,例子中的屬性必須有
說明:
(1)authorities:android:package?+ fileprovider;
(2)<mete-data> 中指出 FileProvider 允許訪問的目錄
(3)這些目錄存放在 res/xml/filepath.xml 文件中
注意:(特別感謝小愛_小世界)
<file-path> 代表的根目錄:Context.getFilesDir()
<external-path> 代表的根目錄:Environment.getExternalStorageDirectory()
<cache-path> 代表的根目錄:getCacheDir()
2、選擇界面的創建-- Activity
Manifest中應該這樣聲明
說明(針對 <intent-filter>):
(1)<action>:android.Intent.action.PICK;
(2)<category>:DEFAULT 和 OPENABLE 都要有;
(3)<data>:要設置 MIME 類型。自己根據需求設置。
至于 Activity 的創建和其他沒有區別,一般是一個列表供用戶選擇。
3、選擇結果的處理及返回結果
說明:
(1)選擇文件后,會得到一個File對象,使用 FileProvider.getUriForFile(Context context,String authority,File file) 方法獲取Uri。如果該文件在不允許訪問的目錄下(filepath.xml),則會拋異常。
(2)返回結果的 Intent 要通過 addFlags(FLAG_GRANT_READ_URI_PERMISSION) 方法進行臨時授權,要設置 data 和 MIME type。
(3)使用 setResult(resultCode , intent) 將結果設置好,并 finish() 當前 Activity。
二、音頻---Audio
1、音頻簡介
Android 音頻控制是由 AudioManager 來管理,通過 getSystemService(Context.AUDIO_SERVICE) ?來獲取該服務。
音頻分為 AudioManager.STREAM_SYSTEM、AudioManager.STREAM_MUSIC、AudioManager.STREAM_RING、AudioManager.STREAM_NOTIFICATION、AudioManager.STREAM_ALARM、AudioManager.STREAM_VOICE_CALL、AudioManager.STREAM_DTMF(雙音多頻,撥號鍵的聲音)七種。
2、音量
當啟動一個新應用,要在 onCreate() 中使用 AudioManager.setVolumeControlStream(int type) 設置應用控制的音量種類。
各種音量的最大值一般都一樣(自己測試得到)。
設置音量大小兩種方法:
(1)漸進式
就是像按音量控制按鈕似的,一點一點的調節。
AudioManager.adjustStreamVolume(int streamType, int direction, int flags)
1)streamType 不介紹,同上面。
2)direction 是調整的方向:
ADJUST_LOWER?降低音量
ADJUST_RAISE?升高音量
ADJUST_SAME?保持不變,這個主要用于向用戶展示當前的音量
3)flags 兩種常見:
FLAG_PLAY_SOUND 調整音量時播放聲音
FLAG_SHOW_UI?調整時顯示音量條,就是按音量鍵出現的界面
(2)直接設置
Audiom.setStreamVolume(streamType , index , flags)
index:音量大小
3、硬件按鍵控制
無論用戶按下設備上任意一個控制按鈕,系統都會廣播一個帶有ACTION_MEDIA_BUTTON的Intent。因此使用廣播來處理這些事件。
因為可能會有多個程序在監聽與媒體按鈕相關的事件,所以我們必須在代碼中控制應用接收相關事件的時機。我們使用?AudioManager?來為我們的應用注冊監聽與取消監聽媒體按鈕事件,當Receiver被注冊上時,它將是唯一一個能夠響應媒體按鈕廣播的Receiver。
4、音頻焦點
由于可能會有多個應用可以播放音頻,所以我們應當考慮一下他們應該如何交互。為了防止多個音樂播放應用同時播放音頻,Android 使用音頻焦點(Audio Focus)來控制音頻的播放——即只有獲取到音頻焦點的應用才能夠播放音頻。
(1)處理焦點變化事件
使用 AudioManager.OnAudioFocusChangeListener,共有八種事件:
AUDIOFOCUS_GAIN:永久獲取焦點,只有手動釋放才會失去焦點;
AUDIOFOCUS_GAIN_TRANSIENT:暫時獲取焦點;
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:暫時獲取焦點,其他音頻降低音量播放;
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:暫時獲取焦點,其他音頻停止播放。
對應四種失去焦點事件 AUDIOFOCUS_LOSS、AUDIOFOCUS_LOSS_TRANSIEN、AUDIOFOCUS_LOSS_TRANSIENT_MAY_DUCK、AUDIOFOCUS_LOSS_TRANSIENT_EXCLUSIVE。
疑問:
經過查閱資料和自己試驗,未發現 TRANSIENT 和 TRANSIENT_EXCLUSIVE 的區別。
如有朋友知曉,請分享,謝謝。
(2)申請音頻焦點
AudioManager.requestAudioFocus( listener , streamType , durationHint )
1)listener:OnAudioFocusChangeListener,指處理申請成功之后 AudioFocus 變化情況的Listener,因為在獲得焦點期間可能又有別的應用申請焦點。
2)streamType:音頻流類型
3)durationHint:(是 AudioManager 中的常量,有以下幾種值)
4)返回值是 AudioManager.AUDIOFOCUS_REQUEST_GAINED 或 AudioManager.AUDIOFOCUS_REQUEST_FAILED。
(3)釋放音頻焦點
abandonAudioFocus( listener )?這樣相當于告知系統我們不再需要獲取焦點并且注銷所關聯的?AudioManager.OnAudioFocusChangeListener?監聽器。
5、處理音頻輸出設備的改變
當有線耳機被拔出或者藍牙設備斷開連接的時候,音頻流會自動輸出到內置的揚聲器上。假設播放聲音很大,這個時候突然轉到揚聲器播放會顯得非常嘈雜。幸運的是,系統會在這種情況下廣播帶有?ACTION_AUDIO_BECOMING_NOISY?的 Intent,所以使用廣播來處理這些事件。