高德地圖圓圈內展示market

最近項目要做一個範圍投放,這裏用到了高德地圖;

首先申請key,就不說了,基本都會申請,這裏注意一個點,就是填寫sha1值的時候一定注意,因爲本人把兩個sha1值全寫成測試版的了,結果打包出來運行就是白屏,測試版的就寫測試版的sha1值,發佈版的就寫發佈版的sha1值,別寫成一樣的了。

獲取測試版的sha1值
點擊studio右上角的Gradle,裏面有一個signingReport,雙擊,下面的就能看到測試版的sha1值
測試版

如果沒有,點擊左上角的/ab
獲取sha1值

獲取發佈版的sha1值
首先打包,打包成功後找到你打包設置生成的keystore文件,複製一下路徑
打包
然後再studio黑窗口中執行命令行 keytool -list -v -keystore [你的keystore文件路徑],如圖
發佈版
輸入你的密碼,就是你打包的密碼,緊接着下面就能看到發佈版的sha1值了

地圖開發:
項目涉及我用到了地圖2d,定位,勾選這倆就可以
這裏寫圖片描述
我的是2d地圖,所以不需要so庫文件,3d的需要,文檔有說明。
獲取權限:

<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.INTERNET" />
<!--允許程序設置內置sd卡的寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
<!--允許程序獲取網絡狀態-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<!--允許程序訪問WiFi網絡信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<!--允許程序讀寫手機狀態和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />     
<!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

添加key值

<meta-data android:name="com.amap.api.v2.apikey" 
android:value="你的key">
</meta-data>

導入jar包就能開始了
佈局文件

    <com.amap.api.maps2d.MapView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mapView"/>

代碼:

 MapView mMapView = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);
    //獲取地圖控件引用
   mMapView = (MapView) getView().findViewById(R.id.mapView);
        aMap = mMapView.getMap();
        //這個一定要寫
        mMapView.onCreate(savedInstanceState);
  }
 @Override
  protected void onDestroy() {
    super.onDestroy();
    //在activity執行onDestroy時執行mMapView.onDestroy(),銷燬地圖
    mMapView.onDestroy();
  }
 @Override
 protected void onResume() {
    super.onResume();
    //在activity執行onResume時執行mMapView.onResume (),重新繪製加載地圖
    mMapView.onResume();
    }
 @Override
 protected void onPause() {
    super.onPause();
    //在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪製
    mMapView.onPause();
    }
 @Override
 protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),保存地圖當前的狀態
    mMapView.onSaveInstanceState(outState);
  } 

以上就能顯示地圖,但是沒功能,因爲展示範圍所以畫個圓,畫圓要根據自己的位置來畫,所以先定位,獲取自己的經緯度

public void initMap() {
        aMap.setMyLocationEnabled(true);
        UiSettings uiSettings = aMap.getUiSettings();
        //設置禁止縮放
      //uiSettings.setZoomGesturesEnabled(false);
        //頁面不顯示加號and減號
        uiSettings.setZoomControlsEnabled(false);
        //定位監聽
        aMap.setOnMyLocationChangeListener(this);
        initLocation();
        getMediaList(SPUtil.getString(SysParam.TOKEN));
    }


    /**
     * 初始化藍點,具體可以看官方文檔
     */
    public void initLocation() {
        myLocationStyle = new MyLocationStyle();//初始化定位藍點樣式類myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//連續定位、且將視角移動到地圖中心點,定位點依照設備方向旋轉,並且會跟隨設備移動。(1秒1次定位)如果不設置myLocationType,默認也會執行此種模式。
        myLocationStyle.interval(5000); //設置連續定位模式下的定位間隔,只在連續定位模式下生效,單次定位模式下不會生效。單位爲毫秒。
        aMap.setMyLocationStyle(myLocationStyle);//設置定位藍點的Style
        aMap.setMyLocationEnabled(true);
        //自己可以設置定位展示的圖標 
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW);
        //定位藍點精度框爲透明    myLocationStyle.strokeColor(Color.TRANSPARENT);
  myLocationStyle.radiusFillColor(Color.TRANSPARENT);
        //如果不想展示不顯示藍點,設置爲true就行,
        myLocationStyle.showMyLocation(false);

    }

     //定位監聽實現的接口
    @Override
    public void onMyLocationChange(Location location) {
        //拿到自己的經緯度
        latLng = new LatLng(location.getLatitude(), location.getLongitude());
        //在地圖上繪製圓
        aMap.addCircle(new CircleOptions()
                .center(latLng)//自己的位置爲中心
                .radius(1000)//圓的半徑
                .fillColor(Color.argb(60, 1, 1, 1))//圓內顏色及透明度
                .strokeColor(Color.RED)//圓邊框顏色
                .strokeWidth(1));//邊框寬度
        //展示我當前的位置,如果不寫不會顯示自己當前在哪
       aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));//參數:1.自己的經緯度,2.地圖的縮放比例
    }

運行起來就能看到以自己當前位置繪製的一個半徑1000的圓
下面在展示圓圈內的market,項目裏是讓展示20個紅包
效果圖
因爲後臺沒有,老闆先讓展示20個紅包,所以就展示了20個假數據,如果真實數據需要自己判斷了

//20個有點多,就展示兩個吧,這裏需要自定義maerket
public void initDate() {
        if (marker != null) {
            marker.remove();
        }
        //自定義佈局,把view轉換成Bitmap
        View markerView = View.inflate(getActivity(), R.layout.marker_iew, null);
        TextView marker_tv = (TextView) markerView.findViewById(R.id.marker_tv);
        marker_tv.setText("5");
        Bitmap bitmap = convertViewToBitmap(markerView);

        MarkerOptions options = new MarkerOptions();
        LatLng markerLat = new LatLng(latLng.latitude + 0.000899, latLng.longitude + 0.001141);
        options.position(markerLat);
        options.title("0");
        options.icon(BitmapDescriptorFactory.fromBitmap(bitmap));

        MarkerOptions options1 = new MarkerOptions();
        LatLng markerLat1 = new LatLng(latLng.latitude - 0.000899 - 0.000899, latLng.longitude - 0.001141 + 0.001141);
        options1.position(markerLat1);
        options1.title("1");
        options1.icon(BitmapDescriptorFactory.fromBitmap(bitmap));

         //添加到集合中
        list.add(options);
        list.add(options1);
        checkLat(list);
}

    public void checkLat(List<MarkerOptions> latList) {
        for (int i = 0; i < latList.size(); i++) {
             //因爲自己是假數據,先註釋了,如果是真的數據,就需要下面的判斷了,如果你要繪製的market點小於你圓的半徑就說明在圓裏,就去繪製market,這裏需要一個工具類,高德自帶的計算距離的,裏面傳入兩個點的經緯度就可以得到距離,在對比半徑就知道該不該繪製
            //  if (latLng != null) {
            //判斷點是否在所繪製的圓內,如果一個點小於圓的半徑說明在該圓內
//                float distance = AMapUtils.calculateLineDistance(latLng, markerLat);
//                if (distance <= 1000) {
//                }
            marker = aMap.addMarker(latList.get(i));
            //}
        }
        aMap.invalidate();
    }


    //view 轉bitmap  這裏碰到一個問題,因爲畫的market太大了,所以 view.layout(0, 0, 50, 68);我就寫死了,但是我的需求上是展示圖標,在圖標上還得顯示一個數字,我把寬高寫成50,68後
    佈局裏的textview死活不顯示,如果寫成view.getMeasuredWidth(),view.getMeasuredHeight()圖標展示就太大了,很糾結,最後我說的實現不出來,公司說的不用加數字,有知道的告訴一聲,多謝!
    public Bitmap convertViewToBitmap(View view) {
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, 50, 68);
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        return bitmap;
    }

最後就是market的點擊事件,點擊後播放一個gif動圖,再跳轉視頻頁面播放

aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //返回true後需要執行自己的一些邏輯
                //marker.showInfoWindow();
                if (infoList.size() > 0) {
                //title是我設置的標識,代表點擊的那個market,從集合取對應對象數據傳值給下個頁面
                    String title = marker.getTitle();
                    int position = Integer.parseInt(title);
                    VideoInfo video = infoList.get(position);
                    Intent intent = new Intent();
                    Bundle bundle = new Bundle();
                    bundle.putString("TITLE", video.getMediaName() + "-第" + video.getPeriods() + "期");
                    bundle.putString("URI", video.getMediaUrl());
                    bundle.putString("jumpUrl", video.getUrl());
                    bundle.putInt("decode_type", 1);
                    bundle.putLong("deliveryId", video.getDeliveryId());
                    bundle.putLong("mediaId", video.getMediaId());
                    bundle.putInt("tag", 1);
                    intent.putExtras(bundle);
                    intent.setClass(getActivity(), RedenvelopesActivity.class);
                    startActivity(intent);
                }

                //返回true,不讓marker移動重新定位
                return true;
            }
        });

播放動圖用的一個第三方 android-gif-drawable,glide加載gif圖過大會卡住不能展示gif圖。
別忘了6.0手機權限

 @TargetApi(Build.VERSION_CODES.M)
    private void permission() {
        List<String> permissionLists = new ArrayList<>();
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_WIFI_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.CHANGE_WIFI_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_NETWORK_STATE);
        }
        if (!permissionLists.isEmpty()) {// 說明肯定有拒絕的權限
      //我的是在fragment裏面請求的權限,所以這裏寫當前的fragment,千萬別寫ActivityCompat,這樣activity會攔截的,不會回調下面權限方法的。
      VideoMapFragment.this.requestPermissions(permissionLists.toArray(new String[permissionLists.size()]),
                    PERMISSION_REQUESTCODE);
        } else {
            initMap();
        }
    }

  @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PERMISSION_REQUESTCODE:
                if (grantResults.length > 0) {
                    for (int grantResult : grantResults) {
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            Common.showToast("某一個權限被拒絕了", true);
                            return;
                        }
                    }
                    initMap();
                }
                break;
            default:
                break;
        }
    }

以上就是全部代碼,做完收穫很多,權限,sha1值倆問題費了好長時間,原來的頁面用的Tabhost展示底部導航狼,裏面的子activity請求權限不回調的,整了好長時間也沒成功,最後我把頁面換成RadioGroup+Fragment才行的,如有知道activity嵌套activity權限申請失敗解決方案的告訴一聲啊,多謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章