編輯:關於Android編程
國內出版的各種地圖系統(包括電子形式),必須至少采用GCJ-02對地理位置進行首次加密。於是,
-谷歌地圖的大陸地圖、高德國內地圖采用GCJ-02對地圖進行加偏。 -百度地圖更是進一步發揮了天朝特色,除了GCJ-02加偏,自己又在此基礎上繼續進行加偏,相應的坐標稱為BD-09坐標。 各地圖廠商使用的坐標系: -火星坐標 GCJ02坐標系 -iOS 地圖 -Gogole地圖 -搜搜(騰訊)、阿裡雲、高德地圖 -地球坐標 WGS84坐標系 -Google 衛星地圖(國外地圖應該都是……) -百度坐標 BD09坐標系 -百度地圖 好了,弄懂了之後。也很簡單嘛,用的是百度地圖SDK,那手上的坐標當然也是百度的。那調用高德和騰訊地圖時, 只需把百度地圖的坐標轉換為火星坐標就行啊。public class MapTranslateUtils { /** * 坐標轉換,騰訊地圖(火星坐標)轉換成百度地圖坐標 * @param lat 騰訊緯度 * @param lon 騰訊經度 * @return 返回結果:經度,緯度 */ public static double[] map_hx2bd(double lat, double lon){ double bd_lat; double bd_lon; double x_pi=3.14159265358979324; double x = lon, y = lat; double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); bd_lon = z * Math.cos(theta) + 0.0065; bd_lat = z * Math.sin(theta) + 0.006; double[] doubles = new double[]{bd_lat,bd_lon}; System.out.println("bd_lat:"+bd_lat); System.out.println("bd_lon:"+bd_lon); return doubles; } /** * 坐標轉換,百度地圖坐標轉換成騰訊地圖坐標 * @param lat 百度坐標緯度 * @param lon 百度坐標經度 * @return 返回結果:緯度,經度 */ public static double[] map_bd2hx(double lat, double lon){ double tx_lat; double tx_lon; double x_pi=3.14159265358979324; double x = lon - 0.0065, y = lat - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); tx_lon = z * Math.cos(theta); tx_lat = z * Math.sin(theta); double[] doubles = new double[]{tx_lat,tx_lon}; return doubles; } }
ok,現在百度地圖坐標系,火星坐標系都在手了。開干。那首先要創建 一個webView頁面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:orientation="vertical"> <com.zk.common.TitleBarView android:id="@+id/titleBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@color/title_bg"/> <WebView android:id="@+id/web_wv" android:layout_width="fill_parent" android:layout_height="fill_parent"/> LinearLayout>WebView的Activity:
public class WebViewActivity extends AppCompatActivity { private WebView detailsWebView; private String mUrl; private Handler handler; private ProgressDialog pd; private String mTitle; public static void launch(Activity activity, String url, String title) { Intent intent = new Intent(activity, WebViewActivity.class); intent.putExtra("url", url); intent.putExtra("title", title); activity.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); mUrl = this.getIntent().getStringExtra("url"); mTitle = this.getIntent().getStringExtra("title"); detailsWebView = (WebView) findViewById(R.id.web_wv); detailsWebView.getSettings().setJavaScriptEnabled(true); detailsWebView.getSettings().setDomStorageEnabled(true); detailsWebView.requestFocus(View.FOCUS_DOWN); detailsWebView.getSettings().setUserAgentString("User-Agent"); detailsWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } }); // 設置web視圖客戶端 detailsWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int progress) {// 載入進度改變而觸發 if (progress == 100) { handler.sendEmptyMessage(1);// 如果全部載入,隱藏進度對話框 } detailsWebView.setVisibility(View.VISIBLE); } super.onProgressChanged(view, progress); } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); } }); detailsWebView.setVisibility(View.GONE); pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setMessage("數據載入中,請稍候!"); handler = new Handler() { public void handleMessage(Message msg) {// 定義一個Handler,用於處理下載線程與UI間通訊 super.handleMessage(msg); if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case 0: pd.show();// 顯示進度對話框 break; case 1: pd.hide();// 隱藏進度對話框,不可使用dismiss()、cancel(),否則再次調用show()時,顯示的對話框小圓圈不會動。 break; } } } }; loadurl(detailsWebView, mUrl); } public void loadurl(final WebView view, final String url) { handler.post(new Runnable() { @Override public void run() { handler.sendEmptyMessage(0); view.loadUrl(url);// 載入網頁 } }); } }首先,選擇判斷是否安裝對應地圖App時,有則啟動,沒有則轉網頁地圖。 1、百度地圖:開發平台URL地址:http://developer.baidu.com/map/wiki/index.php?title=uri/api/android
private void selectBaidu() { this.dismiss(); try { //調起App if (isInstallByread("com.baidu.BaiduMap")) { Intent intent = Intent.getIntent("intent://map/direction?origin=latlng:" + nowLat + "," + nowLng + "|name:&destination=" + desAddress + "&mode=driving?ion=" + "我的位置" + "&referer=Autohome|GasStation#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end"); mActivity.startActivity(intent); } else { /*String url = "http://api.map.baidu.com/direction?origin=latlng:" + mLatitude + "," + mLongitude + "|name:&destination=" + mDestination + "&mode=driving&output=html&src=天工項目共建"; WebViewActivity.launch(getActivity(), url, "網頁版地圖導航");*/ Toast.makeText(mActivity, "如果您沒有安裝百度地圖APP," + "可能無法正常使用導航,建議選擇其他地圖", Toast.LENGTH_SHORT).show(); } } catch (URISyntaxException e) { e.printStackTrace(); } }2、高德地圖 :
private void selectGaode() { this.dismiss(); double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng); double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng); if (isInstallByread("com.autonavi.minimap")) { try { Intent intentOther = new Intent("android.intent.action.VIEW", Uri.parse("androidamap://navi?sourceApplication=amap&lat=" + desLat + "&lon=" + desLng + "&dev=1&stype=0")); intentOther.setPackage("com.autonavi.minimap"); intentOther.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); mActivity.startActivity(intentOther); } catch (Exception e) { String url = "http://m.amap.com/?from=" + nowLat + "," + nowLng + "(from)&to=" + desLat + "," + desLng + "(to)&type=0&opt=1&dev=0"; WebViewActivity.launch(mActivity, url, "網頁版地圖導航"); } } else { String url = "http://m.amap.com/?from=" + txNowLatLng[0] + "," + txNowLatLng[1] + "(from)&to=" + txDesLatLng[0] + "," + txDesLatLng[1] + "(to)&type=0&opt=1&dev=0"; WebViewActivity.launch(mActivity, url, "網頁版地圖導航"); } }需要注意的是上面的dev參數,如果你傳入的已經是火星坐標,參數為0就行,如果你傳入的是高德坐標,則傳入1。這裡是個坑,要注意一下。 3、騰訊地圖: 開發平台URL地址:http://lbs.qq.com/uri_v1/guide-route.html 看官方介紹目前騰訊還不支持直接啟動騰訊地圖App。 所以只能調用web的地圖:
private void selectTencent() { this.dismiss(); double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng); double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng); String url = "http://apis.map.qq.com/uri/v1/routeplan?type=drive&from=&fromcoord=" + txNowLatLng[0] + "," + txNowLatLng[1] + "&to=&tocoord=" + txDesLatLng[0] + "," + txDesLatLng[1] + "&policy=0&referer=myapp"; WebViewActivity.launch(mActivity, url, "網頁版地圖導航"); }另外此處是高德地圖對其他坐標進行轉換的api:
一、簡介這個題目是別人面試UC優視集團Android逆向工程師一職位的面試題,相比較前面的面試題1,增加了一些難度。 二、題目分析1.使
android加密算法很多:DES ,AES,3DES等等。詳情請google,baidu。des的使用安全行很低,再次我們詳細了解下3DES.3DES顧名思義,就是對d
在Android程序開發中,我們經常會去用到Shape這個東西去定義各種各樣的形狀,首先我們了解一下Shape下面有哪些標簽,都代表什麼意思:solid:填充androi
一丶PagerSlidingTabStrp運用扣丁音樂1.0前部分(gif圖大小限制)演示:視頻教程中是直接將PagerSlidingTabStrp例子的主頁面拿來做主頁