Android FM模組學習之一 FM啟動流程

來源:互聯網
上載者:User

標籤:android   fm   

   最近在學習FM模組,FM是一個值得學習的模組,可以從上層看到底層。上層就是FM的按扭操作和介面顯示,從而調用到FM底層驅動來實現廣播收聽的功能。

   看看Fm啟動流程:如:


先進入FMRadio.java類,onCreate初始化一些資料,畫出FM介面,啟動fm在onStart()方法裡啟動FMRadioService.java (調用bindToService(this, osc)方法)。


註冊下fm設定(在設定後發送一個設定廣播,更新FMRadio類的狀態)。

載入初始化資料,擷取頻率地址

newPresetStation("",FmSharedPreferences.getTunedFrequency());


在bindToService(this,osc)方法中,先啟動StartService(同一個Service只onCreate一次),再啟動bindservice(這樣有個好處按返回鍵service不會走onDestroy方法)bindservice通過onBind回傳一個IBinder對象到FMRadio類的內部類ServiceConnection的onServiceConnected方法中,調用enableRadio()方法。


在enableRaido方法中調用FMRadio.java的isAntennaAvailable()方法進行耳機判斷,天線判斷是否可用,通過一個插入拔出廣播接收來控制的(FMRadio中的registerHeadsetListener()方法)action(Intent.ACTION_HEADSET_PLUG) 

mHeadsetPlugged =(intent.getIntExtra("state", 0) == 1); 等於1說明耳機可用,等於0可用。

調用FmRadio方法FmOn  (mService.fmOn())

介面可用enableRadioOnOffUI()


private void enableRadio() {      mIsScaning = false;      mIsSeeking = false;      mIsSearching = false;      boolean bStatus = false;      if (isHdmiOn()) {          showDialog(DIALOG_CMD_FAILED_HDMI_ON);      }else {        <span style="font-family:KaiTi_GB2312;">  </span>if (mService != null) {             try {                if((false == mService.isFmOn()) && isAntennaAvailable()) {                    bStatus = mService.fmOn();                    if(bStatus) {                       tuneRadio(FmSharedPreferences.getTunedFrequency());                       enableRadioOnOffUI();                    }else {Log.e(LOGTAG, "mService.fmOn failed");                       mCommandFailed = CMD_FMON;                       if(isCallActive()) {                          enableRadioOnOffUI();                          showDialog(DIALOG_CMD_FAILED_CALL_ON);                       }else {                          showDialog(DIALOG_CMD_FAILED);                       }                    }                }else {enableRadioOnOffUI();                }             }catch (RemoteException e) {                e.printStackTrace();             }          }      }   }

在FMRadioService.java的fmOn()方法中初始化FmReceiver的引用mReceiver = newFmReceiver(FMRADIO_DEVICE_FD_STRING, fmCallbacks);

 

取出設定儲存的地區頻率的屬性

FmConfig config =FmSharedPreferences.getFMConfiguration();

真正接受fm聲音在

bStatus =mReceiver.enable(FmSharedPreferences.getFMConfiguration());

 

isSpeakerEnabled()擴音器可用,使用者佈建擴音器

 

設定鈴聲路徑

boolean state =mReceiver.setAnalogMode(analogMode); analogMode類比設定低功率

bStatus = setLowPowerMode(false);

電話不在閑置狀太下

int state = getCallState();

fmActionOnCallState(state);


啟動FM  startFM();設定耳機等可以接受fm聲音

AudioSystem.setForceUse(AudioSystem.FOR_MEDIA,AudioSystem.FORCE_NONE);

Fm裝置可用

AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_FM,

                                    AudioSystem.DEVICE_STATE_AVAILABLE, "");

 

註冊遠程組的處理

 bStatus = mReceiver.registerRdsGroupProcessing(FmReceiver.FM_RX_RDS_GRP_RT_EBL|

                                                          FmReceiver.FM_RX_RDS_GRP_PS_EBL|

                                                          FmReceiver.FM_RX_RDS_GRP_AF_EBL|

                                                           FmReceiver.FM_RX_RDS_GRP_PS_SIMPLE_EBL);

 

可用自動跳轉到選著的頻率

bStatus =enableAutoAF(FmSharedPreferences.getAutoAFSwitch());

 

將內建天線設為0

FmTransceiver.java
FmReceiverJNI.setControlNative (sFd, V4L2_CID_PRIVATE_TAVARUA_ANTENNA,iAntenna)

mReceiver.setInternalAntenna(false)



Android FM模組學習之一 FM啟動流程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.