一、學生定位簽到頁面
具體實現步驟:
1.1 高德地圖申請key
1、創建新應用
進入高德地圖api控制台,創建一個新應用。如果您之前已經創建過應用,可直接跳過這個步驟。
2、添加新Key
在創建的應用上點擊"添加新Key"按鈕,在彈出的對話框中,依次:輸入應用名名稱,選擇綁定的服務為“Android平台SDK”,輸入發布版安全碼 SHA1、調試版安全碼 SHA1、及 Package,如下圖所示:
附:SHA1碼的獲取
1.2 實現高德地圖自動定位---准備工作
1、下載jar包,導入jar包
首先去高德地圖API官網下載好相關SDK jar文件,將下載的定位 SDK jar 文件復制到工程(此處截圖以官方示例Demo為例子)的 libs 目錄下,如果有老版本定位 jar 文件存在,請刪除。
注:
- 第一個是2D地圖的jar包,因為最后定位以后我要在地圖上標出來位置
- 第二個是用於定位的jar包
對於每個jar文件,右鍵-選擇Add As Library,導入到工程中。或者使用菜單欄 選擇 File ->Project Structure->Modules-> Dependencies。點擊綠色的加號選擇File dependency. 然后選擇要添加的jar包即可,此時build.gradle中會自動生成如下信息。
2、配置AndroidMainfest.xml文件

<!-- 申請必要的權限--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!--設置key--> <meta-data android:name="com.amap.api.v2.apikey" android:value="這里填寫第一步你申請的那個key" /> <!--聲明定位service--> <service android:name="com.amap.api.location.APSService"></service> </application>
3、Activity的布局文件

<com.amap.api.maps2d.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" > </com.amap.api.maps2d.MapView> <Button android:id="@+id/requet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="簽到" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" />
4.

1 package com.cqvie.android_map; 2 3 import android.content.DialogInterface; 4 import android.icu.text.SimpleDateFormat; 5 import android.os.Bundle; 6 import android.os.Handler; 7 import android.os.Message; 8 import android.support.v7.app.AlertDialog; 9 import android.support.v7.app.AppCompatActivity; 10 import android.util.Log; 11 import android.view.View; 12 import android.widget.Button; 13 import android.widget.Toast; 14 15 import com.amap.api.location.AMapLocation; 16 import com.amap.api.location.AMapLocationClient; 17 import com.amap.api.location.AMapLocationClientOption; 18 import com.amap.api.location.AMapLocationListener; 19 import com.amap.api.maps2d.AMap; 20 import com.amap.api.maps2d.CameraUpdateFactory; 21 import com.amap.api.maps2d.LocationSource; 22 import com.amap.api.maps2d.MapView; 23 import com.amap.api.maps2d.UiSettings; 24 import com.amap.api.maps2d.model.BitmapDescriptorFactory; 25 import com.amap.api.maps2d.model.LatLng; 26 import com.amap.api.maps2d.model.MarkerOptions; 27 import com.cqvie.options.HttpUtilsHttpURLConnection; 28 29 import org.json.JSONException; 30 import org.json.JSONObject; 31 32 import java.util.Date; 33 import java.util.HashMap; 34 import java.util.Map; 35 36 37 public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener { 38 39 private MapView mapView = null; 40 private AMap aMap; 41 private Button request; 42 private AMapLocationClient mLocationClient; 43 private AMapLocationClientOption mLocationOption; 44 private OnLocationChangedListener mListener; 45 //標識,用於判斷是否只顯示一次定位信息和用戶重新定位 46 private boolean isFirstLoc = true; 47 String date=null; 48 49 @Override 50 protected void onCreate(Bundle savedInstanceState) { 51 super.onCreate(savedInstanceState); 52 setContentView(R.layout.activity_main); 53 54 //獲取地圖控件引用 55 mapView = (MapView) findViewById(R.id.map_view); 56 //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),實現地圖生命周期管理 57 mapView.onCreate(savedInstanceState); 58 //獲取簽到按鈕 59 request = (Button) findViewById(R.id.requet); 60 61 init(); 62 //初始化定位 63 mLocationClient = new AMapLocationClient(getApplicationContext()); 64 mLocationClient.setLocationListener(this); 65 //初始化定位參數 66 mLocationOption = new AMapLocationClientOption(); 67 // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors); 68 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); 69 //設置是否返回地址信息(默認返回地址信息) 70 mLocationOption.setNeedAddress(true); 71 //設置是否只定位一次 72 mLocationOption.setOnceLocation(true); 73 //設置是否強制刷新WiFi 74 mLocationOption.setWifiScan(true); 75 //設置定位間隔,單位毫秒,默認為2000ms 76 //mLocationOption.setInterval(2000); 77 //給定位客戶端對象設置定位參數 78 mLocationClient.setLocationOption(mLocationOption); 79 //啟動定位 80 mLocationClient.startLocation(); 81 } 82 83 private void init() { 84 if (aMap == null) { 85 aMap = mapView.getMap(); 86 UiSettings settings = aMap.getUiSettings(); 87 aMap.setLocationSource(this); 88 settings.setMyLocationButtonEnabled(true); 89 aMap.setMyLocationEnabled(true); 90 } 91 } 92 93 94 @Override 95 protected void onDestroy() { 96 super.onDestroy(); 97 //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理 98 mapView.onDestroy(); 99 //mLocationClient.stopLocation(); 100 mLocationClient.onDestroy(); 101 } 102 103 @Override 104 protected void onResume() { 105 super.onResume(); 106 //在activity執行onResume時執行mMapView.onResume (),實現地圖生命周期管理 107 mapView.onResume(); 108 } 109 110 @Override 111 protected void onPause() { 112 super.onPause(); 113 //在activity執行onPause時執行mMapView.onPause (),實現地圖生命周期管理 114 mapView.onPause(); 115 } 116 117 @Override 118 protected void onSaveInstanceState(Bundle outState) { 119 super.onSaveInstanceState(outState); 120 //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),實現地圖生命周期管理 121 mapView.onSaveInstanceState(outState); 122 } 123 124 // @RequiresApi(api = Build.VERSION_CODES.N) 125 @Override 126 public void onLocationChanged(final AMapLocation aMapLocation) { 127 128 if (aMapLocation!=null){ 129 if (aMapLocation.getErrorCode()==0){ 130 //定位成功回調信息,設置相關消息 131 aMapLocation.getLocationType(); 132 aMapLocation.getLatitude();//獲取緯度 133 aMapLocation.getLongitude();//獲取經度 134 aMapLocation.getAccuracy();//獲取精度信息 135 SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 136 Date nowdate = new Date(aMapLocation.getTime()); 137 date = df.format(nowdate);//定位時間 138 aMapLocation.getAddress();//地址,如果option中設置isNeedAddress為false,則沒有此結果,網絡定位結果中會有地址信息,GPS定位不返回地址信息。 139 aMapLocation.getCountry();//國家信息 140 aMapLocation.getProvince();//省信息 141 aMapLocation.getCity();//城市信息 142 aMapLocation.getDistrict();//城區信息 143 aMapLocation.getStreet();//街道信息 144 aMapLocation.getStreetNum();//街道門牌號信息 145 //aMapLocation.getBuildingId();//獲取當前室內定位的建築物Id 146 //aMapLocation.getAccuracy();//獲取精度信息 147 aMapLocation.getPoiName(); 148 aMapLocation.getAoiName(); 149 150 //Log.d("why", String.valueOf(aMapLocation.getAoiName())); 151 // if (isFirstLoc){ 152 //設置縮放級別 153 aMap.moveCamera(CameraUpdateFactory.zoomTo(17)); 154 //將地圖移動到定位點 155 aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()))); 156 //點擊定位按鈕 能夠將地圖的中心移動到定位點 157 mListener.onLocationChanged(aMapLocation); 158 //獲取定位信息 159 final StringBuffer buffer = new StringBuffer(); 160 buffer.append(aMapLocation.getCountry() + "" 161 //+ aMapLocation.getProvince() + "" 162 + aMapLocation.getCity() + "" 163 // + aMapLocation.getProvince() + "" 164 + aMapLocation.getDistrict() + "" 165 + aMapLocation.getStreet() + "" 166 + aMapLocation.getStreetNum()); 167 168 169 Toast.makeText(getApplicationContext(), buffer.toString() + aMapLocation.getAoiName(), Toast.LENGTH_LONG).show(); 170 //Log.d("tzk",buffer.toString()); 171 172 isFirstLoc = false; 173 } 174 } 175 else { 176 Log.d("why", String.valueOf(aMapLocation.getErrorCode())); 177 //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼表。 178 Log.e("AmapError", "location Error, ErrCode:" 179 + aMapLocation.getErrorCode() + ", errInfo:" 180 + aMapLocation.getErrorInfo()); 181 Toast.makeText(getApplicationContext(), "定位失敗", Toast.LENGTH_LONG).show(); 182 } 183 184 request.setOnClickListener(new View.OnClickListener() { 185 @Override 186 public void onClick(View view) { 187 new AlertDialog.Builder(MainActivity.this) 188 .setTitle("簽到") 189 .setMessage(date+ "\n" + aMapLocation.getAoiName()) 190 .setPositiveButton("確定?", new DialogInterface.OnClickListener() { 191 @Override 192 public void onClick(DialogInterface dialogInterface, int i) { 193 //新頁面接收數據 194 Bundle bundle = MainActivity.this.getIntent().getExtras(); 195 //接收name值 196 String name = bundle.getString("name"); 197 //Toast.makeText(MainActivity.this,date,Toast.LENGTH_LONG).show(); 198 signClickListen(date,name,aMapLocation.getAoiName()); 199 200 } 201 }) 202 .show(); 203 } 204 }); 205 } 206 207 //激活定位 208 @Override 209 public void activate(OnLocationChangedListener onLocationChangedListener) { 210 mListener = onLocationChangedListener; 211 } 212 213 @Override 214 public void deactivate() { 215 mListener = null; 216 } 217 218 /** 219 * 簽到點擊事件 220 */ 221 public void signClickListen(final String date,final String name,final String signaddress) { 222 new Thread(new Runnable() { 223 @Override 224 public void run() { 225 String url = HttpUtilsHttpURLConnection.BASE_URL + "/SignServlet"; 226 Map<String, String> params = new HashMap<String, String>(); 227 Message msg = new Message(); 228 Bundle data = new Bundle(); 229 params.put("signtime",date); 230 params.put("name", name); 231 params.put("signaddress", signaddress); 232 String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params); 233 msg.what = 0x12; 234 data.putString("result", result); 235 msg.setData(data); 236 hander.sendMessage(msg); 237 } 238 Handler hander = new Handler() { 239 @Override 240 public void handleMessage(Message msg) { 241 if (msg.what == 0x12) { 242 Bundle data = msg.getData(); 243 String key = data.getString("result");//得到json返回的json 244 // Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show(); 245 try { 246 JSONObject json = new JSONObject(key); 247 String result = (String) json.get("result"); 248 if ("success".equals(result)) { 249 Toast.makeText(MainActivity.this,name + "簽到成功!", Toast.LENGTH_SHORT).show(); 250 251 } else if ("error".equals(result)) { 252 Toast.makeText(MainActivity.this,name + "簽到失敗!", Toast.LENGTH_SHORT).show(); 253 } 254 } catch (JSONException e) { 255 e.printStackTrace(); 256 } 257 } 258 } 259 }; 260 }).start(); 261 } 262 }