欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      Android地圖和定位學(xué)習(xí)總結(jié)

      時間:2019-05-12 12:47:52下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《Android地圖和定位學(xué)習(xí)總結(jié)》,但愿對你工作學(xué)習(xí)有幫助,當然你在寫寫幫文庫還可以找到更多《Android地圖和定位學(xué)習(xí)總結(jié)》。

      第一篇:Android地圖和定位學(xué)習(xí)總結(jié)

      Android地圖和定位學(xué)習(xí)總結(jié)

      首屆 Google 暑期大學(xué)生博客分享大賽——2010 Android 篇 android.location包下有這么一些接口和類: Interfaces GpsStatus.Listener GpsStatus.NmeaListener LocationListener Classes Address Criteria Geocoder GpsSatellite GpsStatus Location LocationManager LocationProvider com.google.android.maps包下有這些類: All Classes GeoPoint ItemizedOverlay ItemizedOverlay.OnFocusChangeListener MapActivity MapController MapView MapView.LayoutParams MapView.ReticleDrawMode MyLocationOverlay Overlay Overlay.Snappable OverlayItem Projection TrackballGestureDetector 我們邊看代碼邊熟悉這些類。

      要獲取當前位置坐標,就是從Location對象中獲取latitude和longitude屬性。那Location對象是如何創(chuàng)建的? LocationManager

      locMan=(LocationManager)getSystemService(Context.LOCATION_SERVICE);//LocationManager對象只能這么創(chuàng)建,不能用new Locationlocation=locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);if(location==null){

      location=locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);} //注意要為應(yīng)用程序添加使用權(quán)限

      所謂getLastKnownLocation

      自然是獲取最新的地理位置信息,那LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER有什么區(qū)別呢?俺也不是學(xué)通信的,對這個不了解,在網(wǎng)上看到有人想“在室外有GPS定位,在室內(nèi)想用Wifi或基站定位”。

      除了直接使用LocationManager提供的靜態(tài)Provider(如GPS_PROVIDER和NETWORK_PROVIDER等)外,還可以使用我們自己創(chuàng)建的LocationProvider對象。創(chuàng)建LocationProvider對象一般要先創(chuàng)建Criteria對象,來設(shè)置我們的LocationProvider要滿足什么樣的標準 Criteria myCri=new Criteria();myCri.setAccuracy(Criteria.ACCURACY_FINE);//精確度 myCri.setAltitudeRequired(false);//海拔不需要

      myCri.setBearingRequired(false);//Bearing是“軸承”的意思,此處可理解為地軸線之類的東西,總之Bearing Information是一種地理位置信息的描述 myCri.setCostAllowed(true);//允許產(chǎn)生現(xiàn)金消費

      myCri.setPowerRequirement(Criteria.POWER_LOW);//耗電 String myProvider=locMan.getBestProvider(myCri,true);public String getBestProvider(Criteria criteria, boolean enabledOnly)Returns the name of the provider that best meets the given criteria.Only providers that are permitted to be accessed by the calling activity will be returned.If several providers meet the criteria, the one with the best accuracy is returned.If no provider meets the criteria, the criteria are loosened in the following sequence: power requirement accuracy bearing speed altitude Note that the requirement on monetary cost is not removed in this process.Parameters

      criteria

      the criteria that need to be matched enabledOnly

      if true then only a provider that is currently enabled is returned Returns

      name of the provider that best matches the requirements only翻譯為“最適合的“ Location location=locMan.getLastKnownLoation(myProvider);double latitude=location.getLatitude();//獲取緯度 double longitude=location.getLongitude();//獲取經(jīng)度

      我想知道當前位置描述(比如“武漢華中科技大學(xué)”而不是一個經(jīng)緯值)呢?這就要使用GeoCoder創(chuàng)建一個Address對象了。

      Geocoder gc=new Geocoder(context,Locale.CHINA);//Locale是java.util中的一個類 List

      listAddress=gc.getFromLocation(latitude,longitude,1);List

      getFromLocation(double latitude, double longitude, int maxResults)Returns an array of Addresses that are known to describe the area immediately surrounding the given latitude and longitude.(返回給定經(jīng)緯值附近的一個Address)既然是“附近”那實際編碼時我們沒必要把經(jīng)緯值給的那么精確,而取一個近似的整數(shù),像這樣: /*自經(jīng)緯度取得地址,可能有多行地址*/ List

      listAddress=gc.getFromLocation((int)latitude,(int)longitude,1);StringBuilder sb=new StringBuilder();/*判斷是不否為多行*/ if(listAddress.size()>0){

      Address address=listAddress.get(0);

      for(int i=0;i

      sb.append(address.getAddressLine(i)).append(”n“);

      }

      sb.append(address.getLocality()).append(”n“);

      sb.append(address.getPostalCode()).append(”n“);

      sb.append(address.getCountryName()).append(”n“);} public int getMaxAddressLineIndex()

      Since: API Level 1 Returns the largest index currently in use to specify an address line.If no address lines are specified,-1 is returned.public String getAddressLine(int index)

      Since: API Level 1 Returns a line of the address numbered by the given index(starting at 0), or null if no such line is present.String

      getCountryName()Returns the localized country name of the address, for example ”Iceland“, or null if it is unknown.String

      getLocality()Returns the locality of the address, for example ”Mountain View“, or null if it is unknown.反過來我們可以輸入地址信息獲取經(jīng)緯值

      Geocoder mygeoCoder=new Geocoder(myClass.this,Locale.getDefault());List

      lstAddress=mygeoCoder.getFromLocationName(strAddress,1);

      //strAddress是輸入的地址信息 if(!lstAddress.isEmpty()){

      Address address=lstAddress.get(0);

      double latitude=address.getLatitude()*1E6;

      double longitude=adress.getLongitude()*1E6;

      GeoPoint geopoint=new GeoPoint((int)latitude,(int)longitude);}

      A class for handling geocoding and reverse geocoding.Geocoding is the process of transforming a street address or other description of a location into a(latitude, longitude)coordinate.Public Constructors Geocoder(Context context, Locale locale)Constructs a Geocoder whose responses will be localized for the given Locale.Geocoder(Context context)Constructs a Geocoder whose responses will be localized for the default system Locale.public List

      maxResults)

      Since: API Level 1

      getFromLocationName(String locationName, int Returns an array of Addresses that are known to describe the named location, which may be a place name

      such as ”Dalvik, Iceland“, an address such as ”1600 Amphitheatre Parkway, Mountain View, CA“, an airport

      code such as ”SFO", etc..The returned addresses will be localized for the locale provided to this class's constructor.The query will block and returned values will be obtained by means of a network lookup.The results are a best

      guess and are not guaranteed to be meaningful or correct.It may be useful to call this method from a thread

      separate from your primary UI thread.Parameters locationName

      maxResults Returns a user-supplied description of a location

      max number of results to return.Smaller numbers(1 to 5)are recommended a list of Address objects.Returns null or empty list if no matches were found or service available.there is no backend

      Throws IllegalArgumentException

      IOException

      說了半天還只是個定位,地圖還沒出來。下面要用到com.google.android.maps包了 下面的代碼我們讓地圖移到指定點

      GeoPoint p=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6));MapView mapview=(MapView)findViewById(R.id.mv);MapController mapContr=mapview.getController();mapview.displayZoomControls(true);//顯示地圖縮放的按鈕 mapContr.animateTo(p);//帶動畫移到p點 mapContr.setZoom(7);setZoom public int setZoom(int zoomLevel)Sets the zoomlevel of the map.The value will be clamped to be between 1 and 21 inclusive, though

      not all areas have tiles at higher zoom levels.This just sets the level of the zoom directly;for a

      step-by-step zoom with fancy interstitial animations, use

      if locationName is null

      if the network is unavailable or any other I/O problem occurs

      zoomIn()or zoomOut().Parameters:

      zoomLevelThe Canvas upon which to draw.Note that this may already have a transformation applied, so be sure to leave it the way you found it.mapViewIf true, draw the shadow layer.If false, draw the overlay contents.public boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)when-The timestamp of the draw.Draw call for animated overlays.By default, calls through to draw(Canvas, MapView, boolean)and returns false.Canvas公共方法

      void

      drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

      Draw the specified bitmap, scaling/translating automatically to fill the destination rectangle.

      第二篇:android百度地圖api實現(xiàn)短信接收定位

      工程文件結(jié)構(gòu):

      demoApplication.java package com.gy.mymaps;

      import android.app.Application;import android.content.Context;import android.widget.Toast;

      import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.MKEvent;

      public class DemoApplication extends Application {

      private static DemoApplication mInstance = null;

      public boolean m_bKeyRight = true;

      BMapManager mBMapManager = null;

      @Override

      public void onCreate(){

      super.onCreate();

      mInstance = this;

      initEngineManager(this);}

      public void initEngineManager(Context context){

      if(mBMapManager == null){

      mBMapManager = new BMapManager(context);

      }

      if(!mBMapManager.init(new MyGeneralListener())){

      Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“BMapManager初始化錯誤!”, Toast.LENGTH_LONG).show();

      } }

      public static DemoApplication getInstance(){

      return mInstance;}

      // 常用事件監(jiān)聽,用來處理通常的網(wǎng)絡(luò)錯誤,授權(quán)驗證錯誤等

      static class MyGeneralListener implements MKGeneralListener {

      public void onGetNetworkState(int iError){

      if(iError == MKEvent.ERROR_NETWORK_CONNECT){

      Toast.makeText(DemoApplication.getInstance().getApplicationContext(), “您的網(wǎng)絡(luò)出錯啦!”,Toast.LENGTH_LONG).show();

      }

      else if(iError == MKEvent.ERROR_NETWORK_DATA){

      Toast.makeText(DemoApplication.getInstance().getApplicationContext(), “輸入正確的檢索條件!”,Toast.LENGTH_LONG).show();

      }

      //...}

      public void onGetPermissionState(int iError){

      //非零值表示key驗證未通過

      if(iError!= 0){

      //鎺堟潈Key閿欒錛?

      Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“請輸入正確的授權(quán)Key,并檢查您的網(wǎng)絡(luò)連接是否正常!error: ”+iError, Toast.LENGTH_LONG).show();

      DemoApplication.getInstance().m_bKeyRight = false;

      }

      else{

      DemoApplication.getInstance().m_bKeyRight = true;

      Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“key認證成功”, Toast.LENGTH_LONG).show();

      }

      }

      } } Mainactivity.java: package com.gy.mymaps;

      import java.util.List;

      import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentValues;import android.database.ContentObserver;import android.database.Cursor;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.telephony.SmsManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

      import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.ItemizedOverlay;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.OverlayItem;import com.baidu.mapapi.search.MKAddrInfo;import com.baidu.mapapi.search.MKBusLineResult;import com.baidu.mapapi.search.MKDrivingRouteResult;import com.baidu.mapapi.search.MKPoiResult;import com.baidu.mapapi.search.MKSearch;import com.baidu.mapapi.search.MKSearchListener;import com.baidu.mapapi.search.MKShareUrlResult;import com.baidu.mapapi.search.MKSuggestionResult;import com.baidu.mapapi.search.MKTransitRouteResult;import com.baidu.mapapi.search.MKWalkingRouteResult;import com.baidu.platform.comapi.basestruct.GeoPoint;//import com.gy.msmsend.R;public class MainActivity extends Activity { //UI相關(guān)

      Button mBtnReverseGeoCode = null;// 將坐標反編碼為地址

      Button mBtnGeoCode = null;// 將地址編碼為坐標

      Button msmSend =null;//短信發(fā)送按鈕

      //地圖相關(guān)

      MapView mMapView = null;// 地圖View

      //搜索相關(guān)

      MKSearch mSearch = null;// 搜索模塊,也可去掉地圖模塊獨立使用

      EditText phoneText;

      String[] as;

      String city=null;

      String pos=null;

      Drawable marker;

      int png=0;

      //

      protected void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      /*

      * 注冊短信變化事件監(jiān)聽

      */

      SmsContent content = new SmsContent(new Handler());

      //注冊短信變化監(jiān)聽

      this.getContentResolver().registerContentObserver(Uri.parse(“content://sms/”), true, content);

      //注冊短信變化監(jiān)聽

      /**

      * 使用地圖sdk前需先初始化BMapManager.* BMapManager是全局的,可為多個MapView共用,它需要地圖模塊創(chuàng)建前創(chuàng)建,* 并在地圖地圖模塊銷毀后銷毀,只要還有地圖模塊在使用,BMapManager就不應(yīng)該銷毀

      */

      DemoApplication app =(DemoApplication)this.getApplication();

      if(app.mBMapManager == null){

      app.mBMapManager = new BMapManager(getApplicationContext());

      /**

      * 如果BMapManager沒有初始化則初始化BMapManager

      */

      app.mBMapManager.init(new DemoApplication.MyGeneralListener());

      }

      setContentView(R.layout.activity_main);

      CharSequence titleLable=“我的位置”;

      setTitle(titleLable);

      //地圖初始化

      mMapView =(MapView)findViewById(R.id.bmapView);

      mMapView.getController().enableClick(true);

      mMapView.getController().setZoom(12);

      // 初始化搜索模塊,注冊事件監(jiān)聽

      mSearch = new MKSearch();

      mSearch.init(app.mBMapManager, new MKSearchListener(){

      public void onGetPoiDetailSearchResult(int type, int error){

      }

      public void onGetAddrResult(MKAddrInfo res, int error){

      if(error!= 0){

      String str = String.format(“錯誤號:%d”, error);

      Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();

      return;

      }

      //地圖移動到該點

      mMapView.getController().animateTo(res.geoPt);

      if(res.type == MKAddrInfo.MK_GEOCODE){

      //地理編碼:通過地址檢索坐標點

      String strInfo = String.format(“緯度:%f 經(jīng)度:%f”, res.geoPt.getLatitudeE6()/1e6, res.geoPt.getLongitudeE6()/1e6);

      Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();

      }

      if(res.type == MKAddrInfo.MK_REVERSEGEOCODE){

      //反地理編碼:通過坐標點檢索詳細地址及周邊poi

      String strInfo = res.strAddr;

      Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();

      EditText editGeoCodeKey =(EditText)findViewById(R.id.geocodekey);

      //設(shè)置城市

      editGeoCodeKey.setText(strInfo);

      }

      //生成ItemizedOverlay圖層用來標注結(jié)果點

      ItemizedOverlay itemOverlay = new ItemizedOverlay(null, mMapView);

      //生成Item

      OverlayItem item = new OverlayItem(res.geoPt, “", null);

      //為maker定義位置和邊界

      marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());

      //給item設(shè)置marker

      item.setMarker(marker);

      //在圖層上添加item

      itemOverlay.addItem(item);

      //清除地圖其他圖層

      mMapView.getOverlays().clear();

      //添加一個標注ItemizedOverlay圖層

      mMapView.getOverlays().add(itemOverlay);

      //執(zhí)行刷新使生效

      mMapView.refresh();

      }

      public void onGetPoiResult(MKPoiResult res, int type, int error){

      }

      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error){

      }

      public void onGetTransitRouteResult(MKTransitRouteResult res, int error){

      }

      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error){

      }

      public void onGetBusDetailResult(MKBusLineResult result, int iError){

      }

      public void onGetSuggestionResult(MKSuggestionResult res, int arg1){

      }

      public void onGetShareUrlResult(MKShareUrlResult result, int type,int error){

      // TODO Auto-generated method stub

      }

      });

      // 設(shè)定地理編碼及反地理編碼按鈕的響應(yīng)

      mBtnReverseGeoCode =(Button)findViewById(R.id.reversegeocode);

      mBtnGeoCode =(Button)findViewById(R.id.geocode);

      msmSend =(Button)findViewById(R.id.sendButton);

      OnClickListener clickListener = new OnClickListener(){

      public void onClick(View v){

      SearchButtonProcess(v);

      }

      };

      mBtnReverseGeoCode.setOnClickListener(clickListener);

      mBtnGeoCode.setOnClickListener(clickListener);

      msmSend.setOnClickListener(clickListener);

      } /**

      * 發(fā)起搜索

      * @param v

      */ void SearchButtonProcess(View v){

      if(mBtnReverseGeoCode.equals(v)){

      EditText lat =(EditText)findViewById(R.id.lat);

      EditText lon =(EditText)findViewById(R.id.lon);

      //得到需要標在地圖上的資源

      marker = getResources().getDrawable(R.drawable.ic_mark0);

      GeoPoint ptCenter = GeoPoint((int)(Float.valueOf(lat.getText().toString())*1e6),(int)(Float.valueOf(lon.getText().toString())*1e6));

      //反Geo搜索

      mSearch.reverseGeocode(ptCenter);

      } else if(mBtnGeoCode.equals(v)){

      new

      EditText editCity =(EditText)findViewById(R.id.city);

      EditText editGeoCodeKey =(EditText)findViewById(R.id.geocodekey);

      //得到需要標在地圖上的資源

      marker = getResources().getDrawable(R.drawable.ic_mark0);

      //Geo搜索

      mSearch.geocode(editGeoCodeKey.getText().toString(),editCity.getText().toString());

      }else if(msmSend.equals(v)){

      phoneText =(EditText)findViewById(R.id.tel);

      //發(fā)送短信

      sendMessage();

      } }

      @Override

      protected void onPause(){

      mMapView.onPause();

      super.onPause();

      }

      @Override

      protected void onResume(){

      mMapView.onResume();

      super.onResume();

      }

      @Override

      protected void onDestroy(){

      mMapView.destroy();

      mSearch.destory();

      super.onDestroy();

      }

      @Override

      protected void onSaveInstanceState(Bundle outState){

      super.onSaveInstanceState(outState);

      mMapView.onSaveInstanceState(outState);

      }

      @Override

      protected void onRestoreInstanceState(Bundle savedInstanceState){

      super.onRestoreInstanceState(savedInstanceState);

      mMapView.onRestoreInstanceState(savedInstanceState);

      }

      /**

      *

      */

      private void sendMessage(){

      // 獲取文本框中的內(nèi)容

      String phone_num = phoneText.getText().toString();

      String content =”QUERY“;

      SmsManager smsMagager = SmsManager.getDefault();

      if(content.length()> 70){

      List sms = smsMagager.divideMessage(content);

      for(String con : sms){

      smsMagager.sendTextMessage(phone_num, null, con, null, null);

      }

      } else {

      smsMagager.sendTextMessage(phone_num, null, content, null, null);

      }

      Toast.makeText(MainActivity.this,R.string.info, Toast.LENGTH_LONG).show();

      }

      /*

      * 監(jiān)聽短信數(shù)據(jù)庫

      */

      class SmsContent extends ContentObserver {

      private Cursor cursor = null;@SuppressLint(”ShowToast“)public SmsContent(Handler handler){

      super(handler);

      // TODO Auto-generated constructor stu

      }

      @SuppressWarnings(”deprecation“)

      @Override

      public void onChange(boolean selfChange){

      // TODO Auto-generated method stub

      super.onChange(selfChange);

      EditText phonenum=(EditText)findViewById(R.id.tel);

      String telnum=”+86“+phonenum.getText().toString();

      // 讀取收件箱中指定號碼的短信

      cursor = managedQuery(Uri.parse(”content://sms/inbox“),new String[] { ”_id“, ”address“, ”read“, ”body“ },” address=? and read=?“,new String[] {telnum,”0“ }, ”_id desc“);

      // 按id排序,如果按date排序的話,修改手機時間后,讀取的短信就不準了

      if(cursor!= null && cursor.getCount()> 0){

      ContentValues values = new ContentValues();

      values.put(”read“, ”1“);// 修改短信為已讀模式

      cursor.moveToNext();

      int smsbodyColumn = cursor.getColumnIndex(”body“);String smsBody = cursor.getString(smsbodyColumn);

      getmypos(smsBody);

      //開啟搜索

      //經(jīng)緯度

      EditText lat =(EditText)findViewById(R.id.lat);EditText lon =(EditText)findViewById(R.id.lon);//設(shè)置輸入框的內(nèi)容

      lat.setText(as[2]);lon.setText(as[1]);//得到需要標在地圖上的資源

      getpng(png);GeoPoint ptCenter = new GeoPoint((int)(Float.valueOf(lat.getText().toString())*1e6),(int)(Float.valueOf(lon.getText().toString())*1e6));//反Geo搜索

      mSearch.reverseGeocode(ptCenter);

      }

      // 在用managedQuery的時候,不能主動調(diào)用close()方法,否則在

      android:layout_height=”match_parent“

      tools:context=”.MainActivity“ >

      android:id=”@+id/bmapView“

      android:layout_width=”fill_parent“

      android:layout_height=”fill_parent“

      android:clickable=”true“ />

      android:id=”@+id/lat“

      android:layout_width=”125dp“

      android:layout_height=”wrap_content“

      android:layout_alignParentLeft=”true“

      android:layout_alignParentTop=”true“

      android:ems=”10“

      android:text=”39.904965“ />

      android:id=”@+id/reversegeocode“

      android:layout_width=”wrap_content“

      android:layout_height=”wrap_content“

      android:layout_alignBaseline=”@+id/lat“

      android:layout_alignBottom=”@+id/lat“

      android:layout_alignParentRight=”true“

      android:text=”查找“ />

      android:id=”@+id/geocode“

      android:layout_width=”wrap_content“

      android:layout_height=”wrap_content“

      android:layout_alignParentRight=”true“

      android:layout_alignTop=”@+id/geocodekey“ android:text=”查找“ />

      android:id=”@+id/sendButton“

      android:layout_width=”wrap_content“

      android:layout_height=”wrap_content“

      android:layout_alignBottom=”@+id/tel“

      android:layout_alignParentRight=”true“

      android:text=”發(fā)送“ />

      ” android:id=“@+id/lon”

      android:layout_width=“125dp”

      android:layout_height=“wrap_content”

      android:layout_alignTop=“@+id/reversegeocode”

      android:layout_toRightOf=“@+id/lat”

      android:ems=“10”

      android:text=“116.327764” />

      android:id=“@+id/geocodekey”

      android:layout_width=“250dp”

      android:layout_height=“wrap_content”

      android:layout_alignParentLeft=“true”

      android:layout_below=“@+id/reversegeocode”

      android:ems=“20”

      android:text=“北京市海淀區(qū)上地十街10號” >

      android:id=“@+id/city”

      android:layout_width=“0dp”

      android:layout_height=“wrap_content”

      android:layout_below=“@+id/reversegeocode”

      android:layout_toLeftOf=“@+id/geocode”

      android:ems=“10”

      android:text=“" />

      android:id=”@+id/tel“

      android:layout_width=”250dp“

      android:layout_height=”wrap_content“

      android:layout_alignParentLeft=”true“

      android:layout_below=”@+id/geocodekey“

      android:ems=”15“

      android:text=”1503769891“ />

      Manifest.xml:

      package=”com.gy.mymaps“

      android:versionCode=”1“

      android:versionName=”1.0“ >

      android:minSdkVersion=”10“

      android:targetSdkVersion=”10“ />

      android:name=”com.gy.mymaps.DemoApplication“

      android:debuggable=”true“

      android:allowBackup=”true“

      android:icon=”@drawable/ic_launcher“

      android:label=”@string/app_name“

      android:theme=”@style/AppTheme“ >

      android:name=”com.baidu.lbsapi.API_KEY“

      android:value=”O(jiān)5h23uRrcyxbaiZs3w7skruP“ />

      android:name=”com.gy.mymaps.MainActivity“

      android:label=”@string/app_name“ >

      /> />

      android:name=”com.android.launcher.permission.READ_SETTINGS“ />

      android:name=”android.permission.WRITE_EXTERNAL_STORAGE“ />

      android:anyDensity=”true“

      android:largeScreens=”true“

      android:normalScreens=”false“

      android:resizeable=”true“

      android:smallScreens=”true“ />

      String.xml:

      mymaps

      Settings 短信發(fā)送成功

      該app是通過發(fā)送QUEST到一個返回位置信息的設(shè)備,返回的短信 接收的短信格式(可以通過修改字符串處理方法來修改處理方法): #Lon=116486291,Lat=39899332,Speed=0,Alt=65,Direction=0#

      第三篇:Android學(xué)習(xí)總結(jié)

      Android學(xué)習(xí)總結(jié)

      零零碎碎的總結(jié):

      1.客戶端的功能邏輯不難,UI界面也不難,但寫UI花的時間是寫功能邏輯的兩倍.2.寫代碼前的思考過程非常重要,即使在簡單的功能,也需要在本子上把該功能的運行過程寫出來.3.要有自己的知識庫,可以是一個工具類,把寫過的,看過的好的代碼放進去,也可以是一個筆記本軟件.因為只有放在知識庫里的東西,才是你最重要的財富.4.如果你想做自由職業(yè)者,你需要學(xué)英語,因為在國外的盈利比國內(nèi)多很多.如果你想進大公司,好公司,你需要學(xué)英語.你想深入學(xué)習(xí)android,但中文的android文章太少了,你查查百度,到處都是copy來copy去的hellword,所以,你需要學(xué)英語.如果你想出國,你需要學(xué)英語.5.Http協(xié)議要研究透徹.http的信息頭有什么信息,分別代表什么,信息體有什么信息,代表什么,都要搞的明明白白.scoket也是一樣.6.在eclipse里的layout文件都有g(shù)raphical Layout.通過這個好好的把UI調(diào)整好.7.Android里的junit每次運行都會打包新的apk到設(shè)備上跑.效率非常慢.如果是跟android無關(guān)的測試,最好自己建立一個單純的java項目做測試.8.面試的時候不要覺得自己提的薪水太高,物以稀為貴明白嗎?不管你的期望薪資多少,都有可能實現(xiàn),這只是時間問題.9.如果一家小公司通過獵頭找到你,即使公司在小,也比外面那些40,50人的公司還要好.不要覺得公司不行,擔心會倒閉.放心吧,至少活1年是沒問題的.10.不要把自己綁在android上,有空也研究下IOS(最近小弟就準備研究ios,剛買了6本書...).11.移動互聯(lián)網(wǎng)最少還有10年的快速增長.android最少還有兩年的快速增長.走android這條路是不會錯的.12.有空多學(xué)點開放平臺的SDK.比如新浪微博,騰訊微博,淘寶平臺,支付寶移動支付平臺,快錢移動支付平臺等等..這些都是不愁沒市場的.13.即使技術(shù)再差,也要發(fā)布一個應(yīng)用到market上去.因為這樣你才了解做一個應(yīng)用的邏輯.14.每個月拿到薪水省500-1000元出來.這些錢投在買學(xué)習(xí)資料,去培訓(xùn)班上課...在培訓(xùn)班,花再多的錢也是值得的.15.你真正的價值在項目經(jīng)驗和對底層的認識上.不要忽略基礎(chǔ)知識.16.如果有空把Android的源代碼看一下.底層的東西很枯燥,但這些很值得學(xué).17..程序員其實是藝術(shù)家.代碼重構(gòu)和設(shè)計模式,是非常非常重要的東西,必須要學(xué)

      18.不要去維護一個項目,要去做一個項目.19.一開始不要輕易去大公司,雖然大公司是可以讓你呆一輩子的.但你的起點低,以后成就也低.20:每天早上提前20分鐘上班,5分鐘把今天的工作計劃寫好.15分鐘用來看各大It論壇的新聞.21:如果以前沒做過java,那就把SSH看下,自己搭建一個小服務(wù)器.這是為了接私活用.22:PS一定要學(xué),接私活用.23:多下載市面上好的應(yīng)用,每天都用,只有這樣你才能了解市場.現(xiàn)在所有的APK都可以反編譯,看源代碼麻煩,但看layout和圖片很容易,所以....你懂的.24.要有羞恥心.25.老板僅僅要求你把東西做完,需求完成.但你必須對自己要更嚴格一點.寫一段代碼,從網(wǎng)上復(fù)制一份代碼,并不是可以用就行了,你還必須明白他的原理,為什么這樣就可以?這才是對你最有用的地方,這也是你今后薪資增長的保證.26.要懂得舍得.移動領(lǐng)域發(fā)展太快,必要時必須要用錢換時間.不然你會遠遠落后別人(我之前花了4000大洋去培訓(xùn)班學(xué)IOS三天).27.要明白自己想要什么,什么才能最大性價比提高你的能力.對我來說,能讓我提高最大的,就是Android和IOS同時會,并且自己可以做架構(gòu)設(shè)計.28.看android技術(shù)書籍最快的學(xué)習(xí)方法,先通讀一次.然后把書本上的demo一個一個寫出來.不要覺得太容易不去寫.很多東西都是這樣,看起來簡單,但做起來難.最后再對照自己寫出來的程序代碼去理解書本的意思.29.應(yīng)用和游戲是2個方向,沒有一個公司會同時做游戲又做應(yīng)用,即使是外包公司,大多也只做一塊.專精一個就可以了.30.每次做完一個項目,要強迫自己做總結(jié),通過這個項目,我學(xué)到了什么新技術(shù)?犯了哪些

      SB錯誤?

      31.一家小公司,如果有正式財務(wù)部,那肯定是正規(guī)的,不要擔心欠薪問題.如果沒有,就說不準了.bbs.12580life.com

      第四篇:Android學(xué)習(xí)總結(jié) 20110325專題

      Android學(xué)習(xí)總結(jié)

      在這段時間主要對Android平臺有了一定的了解,對一些簡單的設(shè)計也有了一定的掌握Android概念

      Android是一個基于Linux核心的開放手持設(shè)備(主要是手機)平臺操作系統(tǒng),與Windows Moble、Symbian等手機操作系統(tǒng)處于同一級別?!癆ndroid大獎賽“首頁上列出的可能設(shè)計方向

      多媒體工具社交網(wǎng)絡(luò)新聞、資訊工具環(huán)保、慈善協(xié)作生產(chǎn)力工具Android Developer Challenge(ADC)游戲?qū)崟r資訊服務(wù)嶄新的用戶界面您想到的應(yīng)用程序項目構(gòu)架

      src/:源代碼(sourse)目錄

      “src”目錄包含了“Android應(yīng)用程序”各個程序源文件。對于上例 ”Bmi.java”是新 序項目中的主要程序塊。gen/:自動生成(Generate)目錄

      gen目錄中存放所有自動生成的文件。最關(guān)鍵就是R.java,這個文件是自動產(chǎn)生的,與”res”目錄下的XML文件內(nèi)容同步更新。

      Android<版本號>/:參考函數(shù)目錄

      此目錄的作用是將AndroidSDK里所有可呼叫的類、方法函數(shù),分門別類的列出,好方便開發(fā)者來參考。

      assert/:對此目錄目前還不是太懂 res/:資源(Resource)目錄

      res目錄存放所有程序中用到的資源文件。在里邊還有兩個經(jīng)常訪問的目錄,分別 “l(fā)ayout/:頁面布局(layout)目錄”和“values/:參數(shù)值(values)目錄”

      “AndroidManifest.xml”是Android應(yīng)用程序的功能列表,每個應(yīng)用程序都在這個文件中,列出該程序所提供的功能。我完成的BMI程序

      此程序是我參考書上的例子所完成的程序。

      BMI,英文全稱:Body Mass Index,中文名稱:身高體重指數(shù),是一個計算值,整個程序的思路是當我們在對應(yīng)的文本框內(nèi)輸入身高(cm)、體重(kg),輸入完成后按下“計算BMI”鍵,屏幕上就會顯示計算結(jié)果,并彈出“你應(yīng)該節(jié)食”、或“你應(yīng)該多吃點”等健康建議的信息框。

      健康指標的計算方法是:身高(height)/(體重(weight)/100)只要BMI值超過25時就算偏胖、BMI值低于20就算偏瘦,介于這之間算正常。

      下面是我完成的程序界面:

      計算得到的BMI值是20.57,在20—25之間,體型正常。由于我對兩個文本框內(nèi)輸入的內(nèi)容進行了限制,因此只容許輸入數(shù)字

      BMI值為25.56,信息框彈出“你該節(jié)食了”

      在界面的下側(cè)有一個“健康小常識按鈕”,當點擊此按鈕時,會鏈接到一個有關(guān)健康生活小常識的網(wǎng)頁上:

      在每次點擊“計算BMI值”按鈕后首先會彈出一個消息框,消息框中包括兩個按 鈕,當點擊確認按鈕時消息框消失;當點擊首頁按鈕時會連接到相應(yīng)的網(wǎng)頁

      下圖為點擊消息框確認按鈕后顯示的網(wǎng)頁:

      總結(jié)

      通過這段時間的學(xué)習(xí),對于Android平臺的整個基本框架有了一定的了解,對程序整個運 及相互之間的調(diào)用流程也有了一定的掌握,但感覺自己java基本功比較薄弱,還得進一步學(xué)習(xí)。由于目前還沒有什么想法,我打算在后面的一段時間內(nèi)主要還是繼續(xù)掌握這方面知識,做一個類似于計算器之類的小軟件,以鞏固我這方面的知識。在查閱資料方面我還有點欠缺,尤其比較怕讀英文資料,這方面還得加強。

      第五篇:Android RIL&Call學(xué)習(xí)總結(jié)

      Android RIL與Call代碼學(xué)習(xí)總結(jié)

      前言

      本文分五部分:Android電信業(yè)務(wù)系統(tǒng)、RIL、Telephony APP Framework、Phone APP、Android通話簡單流程。

      1、Android電信業(yè)務(wù)系統(tǒng)主要敘述Android整個電信業(yè)務(wù)系統(tǒng)的軟件架構(gòu)。

      2、RIL主要敘述Android Radio Interface Layer相關(guān)要點,涉及的代碼主要放在hardwareril目錄下。

      3、Telephony APP Framework主要簡述電信業(yè)務(wù)系統(tǒng)Framework部分代碼相關(guān)要點,涉及的代碼主要放在frameworksbasetelephony目錄下。

      4、Phone APP主要敘述Android的電話業(yè)務(wù)模塊,涉及的代碼主要放在packagesappsPhone目錄下。

      5、Android通話簡單流程主要敘述從上層Phone APP發(fā)起電話的函數(shù)調(diào)用流程。

      一、Android電話業(yè)務(wù)系統(tǒng)

      簡單的說由三部分組成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)

      二、RIL RIL(Radio Interface Layer),是Android電信業(yè)務(wù)系統(tǒng)和底層硬件之間的抽象層,Android提供該層方便用戶移植。手機每次請求相應(yīng)的電信服務(wù),如電話、短信、網(wǎng)絡(luò)連接等,都是通過AT指令與底層硬件進行交互的,拿電話來講,用戶請求撥打電話,需要向RIL發(fā)送相關(guān)的請求,接著RIL按照用戶的請求,調(diào)用相應(yīng)的AT指令發(fā)送接口給底層發(fā)送AT指令,完成用戶撥打電話的流程。簡單的說,對RIL的移植,主要是針對不同的設(shè)備針對AT指令做相應(yīng)的修改。

      1、RIL移植層的三個組成部分

      1)Vendor RIL 提供AT指令發(fā)送接口 2)RIL Daemon 加載RIL相關(guān)的庫同時初始化RIL,注冊RIL相關(guān)函數(shù)接口。同時,RILD也是上層和底層RIL的調(diào)用中轉(zhuǎn)站。3)RIL JNI Layer RIL JNI接口,提供上層Telephony APP Framework調(diào)用

      2、RIL的初始化流程

      加載ril.lib ? RIL_Init()? RIL_register(),詳細可見ridl.c中的main()函數(shù)。

      3、RIL接口的調(diào)用方式

      有兩種方式:主動請求(Solicited)和被動請求(Unsolicited)1)主動請求

      2)被動請求

      void(*OnUnsolicitedResponse)(int unsolResponse, const void *data,size_t datalen);

      4、涉及的主要源代碼文件

      1)reference-ril.c ? 本文件涉及的重要內(nèi)部函數(shù)及功能 requestRadioPower

      開啟通訊模塊 requestQueryNetworkSelectionMode 查詢網(wǎng)絡(luò)模式 requestGetCurrentCalls

      獲取當前通話 requestDial

      請求呼叫 requestWriteSmsToSim

      寫入短信至SIM卡 requestHangup

      掛斷電話 requestSignalStrength

      獲取信號強度 requestRegistrationState

      獲取卡注冊狀態(tài) requestOperator

      獲取運營商名稱 requestSendSMS

      請求發(fā)送短信 requestSetupDataCall

      撥號上網(wǎng) requestSMSAcknowledge

      短信回報

      requestEnterSimPin

      請求輸入SIM PIN碼 requestSendUSSD

      請求USSD業(yè)務(wù) ? 本文件提供給ril.cpp調(diào)用的外部接口 RIL_Init

      RIL初始化 onRequest

      AT請求指令接口(異步方式)

      getVersion

      獲取RIL版本號,當前為“android reference-ril 1.0” onUnsolicited

      AT請求指令接口(同步方式)

      2)ril.cpp 該文件主要提供ril.java調(diào)用接口,實現(xiàn)RIL的JNI調(diào)用方式、RIL Event管理機制 ? 實現(xiàn)了供上層調(diào)用的接口 typedef struct {

      int requestNumber;

      void(*dispatchFunction)(Parcel &p, struct RequestInfo *pRI);

      int(*responseFunction)(Parcel &p, void *response, size_t responselen);} CommandInfo;具體執(zhí)行的操作可以看頭文件ril_commands.h 舉一個例子:

      撥打電話,對應(yīng)的requestNumber為RIL_REQUEST_DIAL,對應(yīng)的dispatchFunction為dispatchDial,對應(yīng)的responseFunction為responseFunction。? RIL Event管理

      與ril_event.cpp的Event接口配合實現(xiàn)RIL Event管理 RIL_startEventLoop rilEventAddWakeup eventLoop ril_event_init ril_event_set ril_event_add ril_event_del 4)rild.c rild的主要初始化工作都在main函數(shù)中進行。

      5、RIL JNI上層對外接口

      SetOnNITZTime

      getIccCardStatus

      supplyIccPin

      supplyIccPuk

      supplyIccPin2

      supplyIccPuk2

      changeIccPin

      changeIccPin2

      getCurrentCalls

      getPDPContextList dial

      getIMSI

      getIMEI

      getIMEISV

      hangupConnection

      acceptCall

      rejectCall

      getLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMute

      getMute

      getSignalStrength

      getRegistrationState getGPRSRegistrationState getOperator

      設(shè)置網(wǎng)絡(luò)身份和時區(qū) 獲取SIM卡狀態(tài) 輸入PIN碼 輸入PUK碼 輸入PIN2碼 輸入PUK2碼 修改PIN碼 修改PIN2碼 獲取當前通話 獲取PDP列表 撥號

      獲取IMSI 獲取IMEI 獲取IMEISV 掛斷電話 接聽電話 電話拒接

      獲取Call失敗錯誤碼 獲取PDP失敗錯誤碼 獲取撥號連接失敗錯誤碼

      設(shè)置手機靜音模式(靜音/非靜音)獲取手機靜音模式(靜音/非靜音)獲取信號強度 獲取卡注冊狀態(tài) 獲取GPRS注冊狀態(tài) 獲取運營商 sendDtmf

      startDtmf stopDtmf sendSMS deleteSmsOnSim writeSmsToSim

      發(fā)送DTMF Start DTMF Stop DTMF 發(fā)送短信

      刪除SIM卡短信 保存短信至SIM卡

      6、RIL機制

      RIL類有三個內(nèi)部類:RILRequest、RILSender、RILReceiver,這三個內(nèi)部類共同實現(xiàn)上層的電信業(yè)務(wù)操作請求。

      RILRequest,電信服務(wù)請求,上層應(yīng)用通過該類與RIL JNI層進行消息的交互,同時RIL JNI層也通過該類與RIL底層進行消息的交互; RILSender,實現(xiàn)上層請求的命令發(fā)送 RILReceiver,負責(zé)接收底層的Response ? 以下是dial的RIL調(diào)用序列 ?上層調(diào)用dial ?設(shè)置Request請求并發(fā)送至RILSender消息處理隊列

      RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…

      send(rr);? RILSender消息處理隊列消息隊列收到EVENT_SEND后往mSocket里邊填寫相應(yīng)請求 ?RILD從mSocket中讀取相應(yīng)的請求為RIL_REQUEST_DIAL,并設(shè)置相應(yīng)的event ?執(zhí)行dispatchDial ? onRequest ? requestDial發(fā)送AT指令

      ?底層給予responseVoid的響應(yīng)

      ?RILD向mSocket填寫相應(yīng)的響應(yīng)信息,并往RILReceiver消息隊列發(fā)送 ? processResponse ?processSolicited ?responseVoid(JNI)

      三、Telephony APP Framework概述

      電信業(yè)務(wù)Framework涉及Call、SMS、SIM卡、PDP等,代碼分為兩個部分,一個是SDK API,一個是平臺內(nèi)部類,不對外開放。這部分簡單的說,就是上層電信業(yè)務(wù)與底層RIL的中間層。

      1、Internal Class 1)ADN(Abbreviated Dialing Numbers,縮位撥號)相關(guān)的類 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相關(guān)的類

      Call:基類,GsmCall和CdmaCall都由該基類擴展實現(xiàn) CdmaCal GsmCall

      CallTracker:基類,GsmCallTracker和CdmaCallTracker都由這個基類進行擴展實現(xiàn) GsmCallTracker: CdmaCallTracker PhoneBase:基類,CDMAPhone和GSMPhone都由這個基類擴展實現(xiàn) CDMAPhone GSMPhone Phone:電話操作的一些接口 CallerInfo CallerInfoAsyncQuery CallForwardInfo:呼叫轉(zhuǎn)移

      CallFailCause:GSM Call失敗錯誤碼 CallFailCause:CDMA Call失敗錯誤碼 3)數(shù)據(jù)連接相關(guān)類

      DataConnection:基類,GsmDataConnection和CdmaDataConnection都基于該類擴展實現(xiàn) GsmDataConnection CdmaDataConnection DataConnectionTracker:基類,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于該類進行擴展實現(xiàn) CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相關(guān)類

      IccCard:基類,RuimCard和SimCard都由該類進行擴展實現(xiàn) RuimCard SimCard IccRecords:基類,RuimRecords和SIMRecords都基于該類進行擴展實現(xiàn) RuimRecords SIMRecords IccProvider IccUtils 5)SMS相關(guān)類

      SMSDispatcher:實現(xiàn)發(fā)送短信

      SmsMessageBase:基類,SmsMessage由該類擴展實現(xiàn) SmsMessage:短信PDU包解析

      2、SDK API Class 實現(xiàn)SDK API接口,具體架構(gòu)見SDK API文檔

      四、Phone APP Android自帶一個Phone App,實現(xiàn)了GSM/CDMA的通話功能,這部分代碼放在packagesappsPhone目錄下。

      Phone APP開機就運行了,可以從AndroidManifest.xml設(shè)置的應(yīng)用權(quán)限看出來

      。開機做如下初始化工作:

      A、初始化Telephony Framework B、Power、Ringer、Keyboard、狀態(tài)欄、SIM卡的注冊工作 C、CallNotifier、PhoneUtils初始化工作 具體可以參見onCreate Phone APP有如下幾個重要的類

      ? PhoneApp requestWakeState:判斷手機是否可休眠 wakeUpScreen:喚醒手機

      PhoneAppBroadcastReceiver:內(nèi)部類,可以實時監(jiān)測手機的狀態(tài),飛行模式、藍牙耳機等。? PhoneUtils 電話基本組件接口,實現(xiàn)電話的一些基本操作,如Dial、Answer、Hangup、Hold等 placeCall:電話呼出 Hangup:掛斷電話 answerCall:接聽電話

      setMute/ setMuteInternal:靜音 turnOnSpeaker:免提

      showIncomingCallUi:顯示來電界面 ? InCallScreen 該類實現(xiàn)通話界面流程,主要如下:

      case R.id.menuAnswerAndHold,保持當前通話并接聽: internalAnswerCall ? PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,結(jié)束當前通話并接聽:

      internalAnswerAndEnd ? PhoneUtils.answerAndEndActive(mPhone)case R.id.menuAnswer,接聽:

      internalAnswerCall ? PhoneUtils.answerCall(mPhone)case R.id.menuIgnore,忽略:

      internalHangupRingingCall ? PhoneUtils.hangupRingingCall(mPhone)case R.id.menuSwapCalls,切換通話:

      internalSwapCalls ? PhoneUtils.switchHoldingAndActive(mPhone)case R.id.menuMergeCalls,合并通話: PhoneUtils.mergeCalls(mPhone)case R.id.menuManageConference,管理電話會議:

      setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE)case R.id.menuShowDialpad,顯示撥號鍵盤: onShowHideDialpad ? mDialer.openDialer(true)case R.id.menuSpeaker,免提:

      onSpeakerClick ? PhoneUtils.turnOnSpeaker case R.id.menuBluetooth,藍牙: onBluetoothClick case R.id.menuMute,靜音:

      onMuteClick ? PhoneUtils.setMute case R.id.menuHold,通話保持: onHoldClick case R.id.menuAddCall,添加通話: PhoneUtils.startNewCall(mPhone)case R.id.menuEndCall,結(jié)束通話: internalHangup ? PhoneUtils.hangup(mPhone)? DTMFTwelveKeyDialer 該類實現(xiàn)DTMF processDtmf:發(fā)送DTMF clearDigits:清除DTMF鍵碼 startDtmfTone:播放DTMF Tone stopDtmfTone:停止播放DTMF Tone ? CallNotifier 繼承于Handler,用來實時監(jiān)測通話狀態(tài)并通知Phone Application,如PHONE_NEW_RINGING_CONNECTION(來電),PHONE_INCOMING_RING(來電響鈴),PHONE_DISCONNECT(通話掛斷),PHONE_BATTERY_LOW(電池電量低),具體相對應(yīng)的處理可參見handleMessage ? CallFeaturesSetting 實現(xiàn)通話設(shè)置,此外該類包含一個內(nèi)部類VoiceMailProviderSettings用來實現(xiàn)語音信箱的設(shè)置

      ? CallCard/ InCallTouchUi 這兩個類都是繼承于FrameLayout,Phone用來實現(xiàn)通話自身的布局需求。

      updatePhotoForCallState:更新替代圖片(如果通話號碼有設(shè)置特定代替圖片的)updateDisplayForConference:通話UI更新(用于電話會議)updateDisplayForPerson:通話UI更新

      getCallFailedString:獲取通話失敗錯誤字符串 displayOnHoldCallStatus:顯示通話保持UI displayMainCallStatus:更新通話UI updateState:更新通話狀態(tài)(供外部類調(diào)用)? BluetoothHandsfree/BluetoothHeadsetService 實現(xiàn)通話藍牙耳機功能,其實現(xiàn)核心是BluetoothHeadsetService,在PhoneApp 創(chuàng)建的時候會啟動它。BluetoothHeadsetService 通過接收底層藍牙服務(wù)的狀態(tài)消息來改變自身狀態(tài),同時它也會監(jiān)聽通話的狀態(tài)變化。onBluetoothEnabled:開啟藍牙設(shè)備 onBluetoothDisabled:關(guān)閉藍牙設(shè)備 connectHeadset:連接藍牙設(shè)備 audioOn:開啟audio audioOff:關(guān)閉audio redial:通過藍牙設(shè)備重播電話 updateBatteryState:更新電池強度 updateSignalState:更新信號強度

      五、Android通話簡單流程

      1、撥打流程(以電話本入口為例)

      ?進入電話本,以某個聯(lián)系人發(fā)起呼叫,此時進入TwelveKeyDialer類的onClick函數(shù)case R.id.dialButton分支,啟動OutgoingCallBroadcaster Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//以新的TASK啟動 ?OutgoingCallBroadcaster發(fā)出Broadcast Announcement sendOrderedBroadcast(broadcastIntent, PERMISSION,new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);?收到Broadcast后,進入OutgoingCallReceiver中的doReceive啟動InCallScreen ?進入internalResolveIntent mInCallInitialStatus = internalResolveIntent(getIntent());?placeCall ?PhoneUtils.placeCallVia/ PhoneUtils.placeCall ? Connection cn = phone.dial(number);Phone是Interface,所屬的dial接口是在PhoneBase的子類GSMPhone中實現(xiàn) ?進入GsmCallTracker類中的dial函數(shù) mCT.dial(newDialString);?調(diào)用CommandsInterface的dial接口

      cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());CommandsInterface的dial接口是在RIL.java中實現(xiàn)的 ?調(diào)用JNI接口dial ?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制

      2、來電流程

      ?CallNotifier的消息處理隊列會收到PHONE_NEW_RINGING_CONNECTION ?onNewRingingConnection響鈴或震動(來電自動接聽也在里邊處理)?顯示來電界面InCallScreen PhoneUtils.showIncomingCallUi();

      3、來電處理

      ? 接聽

      ?internalAnswerCall

      ?PhoneUtils.answerCall(mPhone)

      ?關(guān)閉來電鈴聲等,進入接聽流程phone.acceptCall()?調(diào)用GsmCallTracker的acceptCall mCT.acceptCall();?調(diào)用CommandsInterface acceptCall 接口 cm.acceptCall(obtainCompleteMessage())

      ?調(diào)用RIL JNI接口acceptCall向底層發(fā)送請求

      ?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制 ? 掛斷

      ? internalHangup ? PhoneUtils.hangup(mPhone)? 調(diào)用GsmCallTracker的handup ?調(diào)用CommandsInterface hangupConnection接口

      cm.hangupConnection(conn.getGSMIndex(), obtainCompleteMessage());?調(diào)用RIL JNI接口hangupConnection向底層發(fā)送掛斷請求 ?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制 ? 通話保持恢復(fù)

      PhoneUtils.switchHoldingAndActive(mPhone)? 添加一個新通話,實現(xiàn)多方通話 PhoneUtils.startNewCall(mPhone)

      Android_Phone源代碼來電流程解讀

      ***************************CallNotifier***************************

      本類extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener

      電話狀態(tài)改變之后本類會接到Message,然后本Handler通過Message的不同,進入不同的case:

      然后調(diào)用不同的方法處理各種狀態(tài)改變。

      同時實現(xiàn)了OnQueryCompleteListener接口,當來電的時候會幫助執(zhí)行查詢操作,比如查詢并調(diào)用

      Ringer設(shè)置響鈴方式。

      當來電時,本類會接受到一個PHONE_NEW_RINGING_CONNECTION(Message.what),然后調(diào)用對應(yīng)的方法

      onNewRingingConnection(),該方法又會調(diào)用startIncomingCallQuery()方法,該方法就查詢用戶

      設(shè)置的鈴聲(可能是系統(tǒng)的,也可能是用戶自定義的),如果查詢完成則直接調(diào)用onQueryComplete().假如執(zhí)行超時的話,將會發(fā)送一個延時Message,延時后將默認調(diào)用系統(tǒng)的鈴聲。

      假如在延時發(fā)送Message過程中Query已經(jīng)完成,由于CallNotifier實現(xiàn)了OnQueryCopleteListener,就會自動調(diào)用onQueryComplete()方法,該方法將會首先把可能存在的延時Message給Remove,以防止

      再次設(shè)置鈴聲。接著調(diào)用onCustomRingQueryComplete()方法。然后該方法里面會調(diào)用Ringer的ring()

      方法啟動響鈴。

      ********************************Ringer*************************** Ringer的ring()方法會啟動相應(yīng)的響鈴方式。

      響鈴之后將會又Message發(fā)送,其內(nèi)容為PHONE_STATE_CHANGED

      *******************************InCallScreen**********************

      InCallScreen將會接受到發(fā)送的PHONE_STATE_CHANGED消息,然后調(diào)用onPhoneStateChanged()方法

      該方法將更新屏幕,CallNotifier的onCustomRingQueryComplete里也會通過PhoneUtils.showIncomingCallUi()

      來啟動InCallScreen屏幕。然后由InCallScreen處理,處理方式與前面打電話的大體一致,不過該類第一次調(diào)用時執(zhí)行了

      onCreate()方法,但是以后執(zhí)行都是從onNewIntent()開始.

      下載Android地圖和定位學(xué)習(xí)總結(jié)word格式文檔
      下載Android地圖和定位學(xué)習(xí)總結(jié).doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        Android的學(xué)習(xí)總結(jié)

        Android學(xué)習(xí)總結(jié) Android的學(xué)習(xí)總結(jié) 現(xiàn)在對于Android的學(xué)習(xí)已有斗個學(xué)期了,但它對我來說其實還是一個大大的謎,還有待我去對它一一揭曉。 在還沒有學(xué)習(xí)Android這門課之前,當聽......

        android PopupWindow學(xué)習(xí)總結(jié)[合集]

        PopupWindow學(xué)習(xí)總結(jié)經(jīng)過一段時間的學(xué)習(xí),了解了PopupWindow的基本用法,如下: 1、為PopupWindow的view布局,通過LayoutInflator獲取布局的view.如: LayoutInflater inflater =......

        Android 學(xué)習(xí)總結(jié)1(范文)

        1應(yīng)用程序配置全屏 應(yīng)用程序配置全屏: 【bug】 但是系統(tǒng)提示的是: android:style/Theme_NoTitleBar_Fullscreen ——錯誤的配置 Android的bug。去掉標題欄: android:theme="@a......

        Android總結(jié)

        Android四大組件: Activity—表現(xiàn)屏幕界面Service—后臺服務(wù) BroadcastReceiver—實現(xiàn)廣播機制ContentProvider—實現(xiàn)數(shù)據(jù)存儲 Intent類:用來啟動程序并傳遞信息的類 用于A......

        android vold學(xué)習(xí)總結(jié)(五篇范文)

        vold學(xué)習(xí)總結(jié) Vold(volume daemon):源碼路徑android/system/vold,部分引用代碼位于android/system/core/libsysutils/src,android/system/core/include/sysutils/下。 它用于......

        Android應(yīng)用程序設(shè)計學(xué)習(xí)總結(jié)

        學(xué)習(xí)總結(jié) Android具有開放性。有一下平臺優(yōu)勢: 一、開放性 在優(yōu)勢方面,Android平臺首先就是其開發(fā)性,開發(fā)的平臺允許任何移動終端廠商加入到Android聯(lián)盟中來。顯著的開放性可以......

        Android BroadcastReceiver學(xué)習(xí)總結(jié)(五篇)

        Android BroadcastReceiver學(xué)習(xí)總結(jié) BroadCast(廣播),概念:一種在系統(tǒng)內(nèi)進行通信的機制.通過這種機制,它能夠?qū)⑾到y(tǒng)中的某個進程的信息或者意圖傳遞到其他的對這些信息或者意......

        Android的getSystemService函數(shù)學(xué)習(xí)總結(jié)

        函數(shù)getSystemService。 public Object getSystemService (String name) Parameters nameThe name of the desired service. ReturnsThe service or null if the name does......