Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android FM模塊學習之一 FM啟動流程

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

編輯:關於Android編程

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

看看Fm啟動流程:如下圖:

\


<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z8i9+MjrRk1SYWRpby5qYXZhwOCjrG9uQ3JlYXRls/XKvLuv0rvQqcr9vt2jrLuts/ZGTb3nw+ajrMb0tq9mbdTab25TdGFydCgpt723qMDvxvS2r0ZNUmFkaW9TZXJ2aWNlLmphdmEgKLX308NiaW5kVG9TZXJ2aWNlKHRoaXMsIG9zYym3vbeoKaGjPC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20141120/20141120083135115.jpg" alt="\">

注冊下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 {
          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)



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved