精华内容
下载资源
问答
  • 这是一个 android 应用程序,它提供了安装此应用程序的人的位置手机信号塔位置)。 这个应用程序的工作有点独特。 通过 SMS 收到关键字“位置”后,接收者的位置发送给 SMS 的发送者。 例如:假设有 A、B、C、D...
  • 微信发送位置源码

    千次阅读 2016-11-02 19:02:42
    如今的手机已经泛滥,谁都去做手机,做家具的也去做手机,的确,手机变得很重要,手机的重要直接带来的就是手机内部应用和服务的升级,APP也是服务的一种,人们都说软件已经走下滑路线,再加上,微信小程序的出现,...

    科技评论

    如今的手机已经泛滥,谁都去做手机,做家具的也去做手机,的确,手机变得很重要,手机的重要直接带来的就是手机内部应用和服务的升级,APP也是服务的一种,人们都说软件已经走下滑路线,再加上,微信小程序的出现,更是加剧了软件淡化的趋势,其实,微信的小程序的确可以代替一部分软件,但是最终还是代替不了软件,就像小程序永远都不会代替微信它本身,也有一部分企业已经开发出自己的小程序,准备借势大展宏图,究竟效果怎样,到时我们就知道了,说到底它的最终模式还是一个像应用市场一样的东西,对于技术来讲,Android需求没有以前那么大了,不是因为小程序来了,而是时代快要变了,另一个势头我们都很期待。

    效果演示

    实现的功能

    1. 根据经纬度定位
    2. 根据所在的经纬度搜索附近的地点
    3. 根据关键字搜索地点
    4. 为地图增加标记
    5. 发送选择的地点位置信息

    你能学到什么

    1. 高德地图的使用
    2. 如何定位(获取当前位置信息)
    3. 如何通过经纬度搜索附近的地点(也叫兴趣点poi)
    4. 如何通过关键字搜索附近的兴趣点

    微信位置发送分析

    1. 进入发送页面后,自己当前位置有一个蓝色标记,它是不会变的,在蓝色的标记上有一个红色的小钉子,是用来显示你想要定位定到哪去,它在地图的中央
    2. 地图下面有一个列表,是根据当前的经纬度搜索出来的兴趣点,也叫poi,默认选中第一个条目,也就是当前的位置
    3. 当你点击列表的条目时,此时地图会根据你点击的条目变换到你所点击的地点去,此时,被点击的条目被选中
    4. 当你手动的移动地图的时候,中间的红色小钉,不会动,当你移动完地图之后,红色小红钉会有一个上下移动的动画,表示你要定位到红色小红钉处,此时根据小红钉所处的经纬度来搜索附近的兴趣点(poi)
    5. 进入搜索页面之后,通过关键字搜索地点,搜索完成之后,展示在列表里,默认选中第一个,点击条目之后,根据经纬度继续搜索附近的poi,此时列表的第一项是被点击的条目,地图同时移动到被点击的地点处
    6. 点击发送后拿到当前被选中的条目的位置信息,然后发送

    分析完了微信的,下面就开始我们自己的,跟着我走,实现你自己想要的模样吧

    代码实现及步骤

    1. 首页获取定位信息

    public class MapUtils implements AMapLocationListener {
            private AMapLocationClient locationClient = null;  // 定位
            private AMapLocationClientOption locationOption = null;  // 定位设置
    
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                mLonLatListener.getLonLat(aMapLocation);
                locationClient.stopLocation();
                locationClient.onDestroy();
                locationClient = null;
                locationOption = null;
            }
    
            private LonLatListener mLonLatListener;
    
            public void getLonLat(Context context, LonLatListener lonLatListener) {
                locationClient = new AMapLocationClient(context);
                locationOption = new AMapLocationClientOption();
                locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);// 设置定位模式为高精度模式
                locationClient.setLocationListener(this);// 设置定位监听
                locationOption.setOnceLocation(false); // 单次定位 每隔2秒定位一次
                locationOption.setNeedAddress(true);//返回地址信息
                mLonLatListener = lonLatListener;//接口
                locationClient.setLocationOption(locationOption);// 设置定位参数
                locationClient.startLocation(); // 启动定位
            }
    
            public interface LonLatListener {
                void getLonLat(AMapLocation aMapLocation);
            }
    
        }
    

    2. 逆地理编码,经纬度转换

    逆地理编码步骤:

    1. 创建GeocodeSearch实例
        geocoderSearch = new GeocodeSearch(getApplicationContext());
    1. 实现GeocodeSearch.OnGeocodeSearchListener监听
        //设置逆地理编码监听
            geocoderSearch.setOnGeocodeSearchListener(this);
    
    
              /**
                 * 逆地理编码查询回调
                 *
                 * @param result
                 * @param i
                 */
                @Override
                public void onRegeocodeSearched(RegeocodeResult result, int i) {
    
                    if (i == 1000) {//转换成功
                        if (result != null && result.getRegeocodeAddress() != null
                                && result.getRegeocodeAddress().getFormatAddress() != null) {
                            //拿到详细地址
                            addressName = result.getRegeocodeAddress().getFormatAddress(); // 逆转地里编码不是每次都可以得到对应地图上的opi
    
                            //条目中第一个地址 也就是当前你所在的地址
                            mAddressInfoFirst = new SearchAddressInfo(addressName, addressName, false, convertToLatLonPoint(mFinalChoosePosition));
    
                            //其实也是可以在这就能拿到附近的兴趣点的
    
                        } else {
                            ToastUtil.show(this, "没有搜到");
                        }
                    } else {
                        ToastUtil.showerror(this, i);
                    }
    
                }
    
                /**
                 * 地理编码查询回调
                 *
                 * @param geocodeResult
                 * @param i
                 */
                @Override
                public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
    
                }
    

    通过RegeocodeResult拿到编码后的信息

    3. 通过经纬度信息搜索poi

      /**
         * 开始进行poi搜索
         * 通过经纬度获取附近的poi信息
         * <p>
         * 1、keyword 传 ""
         * 2、poiSearch.setBound(new PoiSearch.SearchBound(lpTemp, 5000, true)); 根据
         */
        protected void doSearchQueryByPosition() {
    
            currentPage = 0;
            query = new PoiSearch.Query("", "", city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
            query.setPageSize(20);// 设置每页最多返回多少条poiitem
            query.setPageNum(currentPage);// 设置查第一页
    
            LatLonPoint llPoint = convertToLatLonPoint(mFinalChoosePosition);
    
            if (llPoint != null) {
                poiSearch = new PoiSearch(this, query);
                poiSearch.setOnPoiSearchListener(this);  // 实现  onPoiSearched  和  onPoiItemSearched
                poiSearch.setBound(new PoiSearch.SearchBound(llPoint, 5000, true));//
                // 设置搜索区域为以lpTemp点为圆心,其周围5000米范围
                poiSearch.searchPOIAsyn();// 异步搜索
            }
        }

    4. 通过关键字搜索poi

      /**
         * 按照关键字搜索附近的poi信息
         *
         * @param key
         */
        protected void doSearchQueryByKeyWord(String key) {
            currentPage = 0;
            query = new PoiSearch.Query(key, "", city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
            query.setPageSize(20);// 设置每页最多返回多少条poiitem
            query.setPageNum(currentPage);// 设置查第一页
            query.setCityLimit(true); //限定城市
    
            if (lp != null) {
                poiSearch = new PoiSearch(this, query);
                poiSearch.setOnPoiSearchListener(this);   // 实现  onPoiSearched  和  onPoiItemSearched
                poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));//
                // 设置搜索区域为以latLonPoint点为圆心,其周围5000米范围
                poiSearch.searchPOIAsyn();// 异步搜索
            }
        }

    通过poiSearch.setOnPoiSearchListener(this)实现对搜索结果的监听,在onPoiSearched(),onPoiItemSearched()回调里处理返回的结果

    5. 处理拿到的poi信息

    @Override
            public void onPoiSearched(PoiResult result, int rcode) {
    
                if (rcode == 1000) {
                    if (result != null && result.getQuery() != null) {// 搜索poi的结果
                        if (result.getQuery().equals(query)) {// 是否是同一条
                            poiResult = result;
                            poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
    
                            List<SuggestionCity> suggestionCities = poiResult
                                    .getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
    
                            //搜索到数据
                            if (poiItems != null && poiItems.size() > 0) {
    
                                mData.clear();
    
                                //先将 逆地理编码过的当前地址 也就是条目中第一个地址 放到集合中
                                mData.add(mAddressInfoFirst);
    
                                SearchAddressInfo addressInfo = null;
    
                                for (PoiItem poiItem : poiItems) {
    
                                    addressInfo = new SearchAddressInfo(poiItem.getTitle(), poiItem.getSnippet(), false, poiItem.getLatLonPoint());
    
                                    mData.add(addressInfo);
                                }
                                if (isHandDrag) {
                                    mData.get(0).isChoose = true;
                                }
                                addressAdapter.notifyDataSetChanged();
    
                            } else if (suggestionCities != null
                                    && suggestionCities.size() > 0) {
                                showSuggestCity(suggestionCities);
                            } else {
                                ToastUtil.show(ShareLocationActivity.this,
                                        "对不起,没有搜索到相关数据");
                            }
                        }
                    } else {
                        Toast.makeText(this, "对不起,没有搜索到相关数据!", Toast.LENGTH_SHORT).show();
                    }
                }
    
            }

    6. 移动地图

    1. 设置监听
         //对amap添加移动地图事件监听器
         aMap.setOnCameraChangeListener(this);
    1. 实现监听
         /**
                 * 移动地图时调用
                 *
                 * @param cameraPosition
                 */
                @Override
                public void onCameraChange(CameraPosition cameraPosition) {
    
                }
    
                /**
                 * 地图移动结束后调用
                 *
                 * @param cameraPosition
                 */
                @Override
                public void onCameraChangeFinish(CameraPosition cameraPosition) {
    
                    //每次移动结束后地图中心的经纬度
                    mFinalChoosePosition = cameraPosition.target;
    
                    centerImage.startAnimation(centerAnimation);
    
    
                    if (isHandDrag || isFirstLoad) {//手动去拖动地图
    
                        // 开始进行poi搜索
                        getAddressFromLonLat(cameraPosition.target);
                        doSearchQueryByPosition();
    
                    } else if (isBackFromSearch) {
                        //搜索地址返回后 拿到选择的位置信息继续搜索附近的兴趣点
                        isBackFromSearch = false;
                        doSearchQueryByPosition();
                    } else {
                        addressAdapter.notifyDataSetChanged();
                    }
                    isHandDrag = true;
                    isFirstLoad = false;
                }

    7. 分享页面的完整代码

    public class ShareLocationActivity extends Activity implements GeocodeSearch.OnGeocodeSearchListener, AMap.OnMapClickListener, AMap.OnCameraChangeListener, PoiSearch.OnPoiSearchListener, AdapterView.OnItemClickListener, View.OnClickListener {
    
            private String addressName;
            private GeocodeSearch geocoderSearch;
            private MapView mapView;
            private ListView listView;
            private LatLonPoint latLonPoint;
            private AMap aMap;
            private Marker locationMarker;
            private LatLng mFinalChoosePosition;
            private ImageView centerImage;
            private Animation centerAnimation;
            private int currentPage = 0;// 当前页面,从0开始计数
            private PoiSearch.Query query;// Poi查询条件类
            private PoiSearch poiSearch;
            private String city;
            private PoiResult poiResult; // poi返回的结果
            private List<PoiItem> poiItems;// poi数据
            private ArrayList<SearchAddressInfo> mData = new ArrayList<>();
            public SearchAddressInfo mAddressInfoFirst = null;
            private boolean isHandDrag = true;
            private boolean isFirstLoad = true;
            private boolean isBackFromSearch = false;
            private AddressAdapter addressAdapter;
            private UiSettings uiSettings;
            private ImageButton locationButton;
            private ImageView search;
            private TextView send;
            private ImageView back;
            private static final int SEARCH_ADDDRESS = 1;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_share_location);
    
                double longitude = getIntent().getDoubleExtra("longitude", 0);
                double latitude = getIntent().getDoubleExtra("latitude", 0);
                city = getIntent().getStringExtra("cityCode");
    
                //经纬度信息
                latLonPoint = new LatLonPoint(latitude, longitude);
    
                mapView = (MapView) findViewById(R.id.mapview);
                listView = (ListView) findViewById(R.id.listview);
                centerImage = (ImageView) findViewById(R.id.center_image);
                locationButton = (ImageButton) findViewById(R.id.position_btn);
                search = (ImageView) findViewById(R.id.seach);
                send = (TextView) findViewById(R.id.send);
                back = (ImageView) findViewById(R.id.base_back);
    
                search.setOnClickListener(this);
                send.setOnClickListener(this);
                back.setOnClickListener(this);
    
                locationButton.setOnClickListener(this);
    
                mapView.onCreate(savedInstanceState);
    
                centerAnimation = AnimationUtils.loadAnimation(this, R.anim.center_anim);
                addressAdapter = new AddressAdapter(this, mData);
                listView.setAdapter(addressAdapter);
    
                listView.setOnItemClickListener(this);
                initMap();
    
            }
    
            @Override
            protected void onResume() {
                super.onResume();
                mapView.onResume();
            }
    
            @Override
            public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
                super.onSaveInstanceState(outState, outPersistentState);
                mapView.onSaveInstanceState(outState);
            }
    
            private void initMap() {
    
                if (aMap == null) {
                    aMap = mapView.getMap();
    
                    //地图ui界面设置
                    uiSettings = aMap.getUiSettings();
    
                    //地图比例尺的开启
                    uiSettings.setScaleControlsEnabled(true);
    
                    //关闭地图缩放按钮 就是那个加号 和减号
                    uiSettings.setZoomControlsEnabled(false);
    
                    aMap.setOnMapClickListener(this);
    
                    //对amap添加移动地图事件监听器
                    aMap.setOnCameraChangeListener(this);
    
                    locationMarker = aMap.addMarker(new MarkerOptions()
                            .anchor(0.5f, 0.5f)
                            .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker)))
                            .position(new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude())));
    
                    //拿到地图中心的经纬度
                    mFinalChoosePosition = locationMarker.getPosition();
                }
    
                setMap();
                aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude()), 20));
            }
    
            private void setMap() {
    
                geocoderSearch = new GeocodeSearch(getApplicationContext());
    
                //设置逆地理编码监听
                geocoderSearch.setOnGeocodeSearchListener(this);
            }
    
            /**
             * 根据经纬度得到地址
             */
            public void getAddressFromLonLat(final LatLng latLonPoint) {
                // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
                RegeocodeQuery query = new RegeocodeQuery(convertToLatLonPoint(latLonPoint), 200, GeocodeSearch.AMAP);
                geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
            }
    
            /**
             * 把LatLng对象转化为LatLonPoint对象
             */
            public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
                return new LatLonPoint(latlon.latitude, latlon.longitude);
            }
    
            /**
             * 把LatLonPoint对象转化为LatLon对象
             */
            public LatLng convertToLatLng(LatLonPoint latLonPoint) {
                return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());
            }
    
            /**
             * 逆地理编码查询回调
             *
             * @param result
             * @param i
             */
            @Override
            public void onRegeocodeSearched(RegeocodeResult result, int i) {
    
                if (i == 1000) {//转换成功
                    if (result != null && result.getRegeocodeAddress() != null
                            && result.getRegeocodeAddress().getFormatAddress() != null) {
                        //拿到详细地址
                        addressName = result.getRegeocodeAddress().getFormatAddress(); // 逆转地里编码不是每次都可以得到对应地图上的opi
    
                        //条目中第一个地址 也就是当前你所在的地址
                        mAddressInfoFirst = new SearchAddressInfo(addressName, addressName, false, convertToLatLonPoint(mFinalChoosePosition));
    
                        //其实也是可以在这就能拿到附近的兴趣点的
    
                    } else {
                        ToastUtil.show(this, "没有搜到");
                    }
                } else {
                    ToastUtil.showerror(this, i);
                }
    
            }
    
            /**
             * 地理编码查询回调
             *
             * @param geocodeResult
             * @param i
             */
            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
    
            }
    
            @Override
            public void onMapClick(LatLng latLng) {
                Toast.makeText(this, "latitude" + String.valueOf(latLng.latitude), Toast.LENGTH_SHORT).show();
            }
    
            /**
             * 移动地图时调用
             *
             * @param cameraPosition
             */
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {
    
            }
    
            /**
             * 地图移动结束后调用
             *
             * @param cameraPosition
             */
            @Override
            public void onCameraChangeFinish(CameraPosition cameraPosition) {
    
                //每次移动结束后地图中心的经纬度
                mFinalChoosePosition = cameraPosition.target;
    
                centerImage.startAnimation(centerAnimation);
    
    
                if (isHandDrag || isFirstLoad) {//手动去拖动地图
    
                    // 开始进行poi搜索
                    getAddressFromLonLat(cameraPosition.target);
                    doSearchQueryByPosition();
    
                } else if (isBackFromSearch) {
                    //搜索地址返回后 拿到选择的位置信息继续搜索附近的兴趣点
                    isBackFromSearch = false;
                    doSearchQueryByPosition();
                } else {
                    addressAdapter.notifyDataSetChanged();
                }
                isHandDrag = true;
                isFirstLoad = false;
            }
    
            /**
             * 开始进行poi搜索
             * 通过经纬度获取附近的poi信息
             * <p>
             * 1、keyword 传 ""
             * 2、poiSearch.setBound(new PoiSearch.SearchBound(lpTemp, 5000, true)); 根据
             */
            protected void doSearchQueryByPosition() {
    
                currentPage = 0;
                query = new PoiSearch.Query("", "", city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
                query.setPageSize(20);// 设置每页最多返回多少条poiitem
                query.setPageNum(currentPage);// 设置查第一页
    
                LatLonPoint llPoint = convertToLatLonPoint(mFinalChoosePosition);
    
                if (llPoint != null) {
                    poiSearch = new PoiSearch(this, query);
                    poiSearch.setOnPoiSearchListener(this);  // 实现  onPoiSearched  和  onPoiItemSearched
                    poiSearch.setBound(new PoiSearch.SearchBound(llPoint, 5000, true));//
                    // 设置搜索区域为以lpTemp点为圆心,其周围5000米范围
                    poiSearch.searchPOIAsyn();// 异步搜索
                }
            }
    
            @Override
            protected void onPause() {
                super.onPause();
                mapView.onPause();
            }
    
            @Override
            protected void onDestroy() {
                super.onDestroy();
                mapView.onDestroy();
            }
    
            @Override
            public void onPoiSearched(PoiResult result, int rcode) {
    
                if (rcode == 1000) {
                    if (result != null && result.getQuery() != null) {// 搜索poi的结果
                        if (result.getQuery().equals(query)) {// 是否是同一条
                            poiResult = result;
                            poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
    
                            List<SuggestionCity> suggestionCities = poiResult
                                    .getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
    
                            //搜索到数据
                            if (poiItems != null && poiItems.size() > 0) {
    
                                mData.clear();
    
                                //先将 逆地理编码过的当前地址 也就是条目中第一个地址 放到集合中
                                mData.add(mAddressInfoFirst);
    
                                SearchAddressInfo addressInfo = null;
    
                                for (PoiItem poiItem : poiItems) {
    
                                    addressInfo = new SearchAddressInfo(poiItem.getTitle(), poiItem.getSnippet(), false, poiItem.getLatLonPoint());
    
                                    mData.add(addressInfo);
                                }
                                if (isHandDrag) {
                                    mData.get(0).isChoose = true;
                                }
                                addressAdapter.notifyDataSetChanged();
    
                            } else if (suggestionCities != null
                                    && suggestionCities.size() > 0) {
                                showSuggestCity(suggestionCities);
                            } else {
                                ToastUtil.show(ShareLocationActivity.this,
                                        "对不起,没有搜索到相关数据");
                            }
                        }
                    } else {
                        Toast.makeText(this, "对不起,没有搜索到相关数据!", Toast.LENGTH_SHORT).show();
                    }
                }
    
            }
    
            @Override
            public void onPoiItemSearched(PoiItem poiItem, int i) {
    
            }
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                mFinalChoosePosition = convertToLatLng(mData.get(position).latLonPoint);
                for (int i = 0; i < mData.size(); i++) {
                    mData.get(i).isChoose = false;
                }
                mData.get(position).isChoose = true;
    
                isHandDrag = false;
    
                // 点击之后,改变了地图中心位置, onCameraChangeFinish 也会调用
                // 只要地图发生改变,就会调用 onCameraChangeFinish ,不是说非要手动拖动屏幕才会调用该方法
                aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mFinalChoosePosition.latitude, mFinalChoosePosition.longitude), 20));
            }
    
            /**
             * poi没有搜索到数据,返回一些推荐城市的信息
             */
            private void showSuggestCity(List<SuggestionCity> cities) {
                String infomation = "推荐城市\n";
                for (int i = 0; i < cities.size(); i++) {
                    infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
                            + cities.get(i).getCityCode() + "城市编码:"
                            + cities.get(i).getAdCode() + "\n";
                }
                ToastUtil.show(this, infomation);
            }
    
            @Override
            public void onClick(View v) {
                if (v == locationButton) {
                    //回到当前位置
                    aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude()), 20));
                } else if (v == back) {
                    finish();
                } else if (v == search) {
    
                    Intent intent = new Intent(this, SearchAddressActivity.class);
                    intent.putExtra("position", mFinalChoosePosition);
                    intent.putExtra("city", city);
                    startActivityForResult(intent, SEARCH_ADDDRESS);
                    isBackFromSearch = false;
    
                } else if (v == send) {
    
                    sendLocaton();
    
                }
            }
    
            private void sendLocaton() {
                SearchAddressInfo addressInfo = null;
                for (SearchAddressInfo info : mData) {
                    if (info.isChoose) {
                        addressInfo = info;
                    }
                }
                if (addressInfo != null) {
    
                    ToastUtil.show(this, "要发送的数据:"
                            + "\n 经度:" + addressInfo.latLonPoint.getLongitude()
                            + "\n 纬度:" + addressInfo.latLonPoint.getLatitude()
                            + "\n 地址:" + addressInfo.addressName);
                } else {
                    ToastUtil.show(this, "请选择地址");
                }
            }
    
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
    
                if (requestCode == SEARCH_ADDDRESS && resultCode == RESULT_OK) {
                    SearchAddressInfo info = (SearchAddressInfo) data.getParcelableExtra("position");
                    mAddressInfoFirst = info; // 上一个页面传过来的 位置信息
                    info.isChoose = true;
                    isBackFromSearch = true;
                    isHandDrag = false;
                    //移动地图
                    aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(info.latLonPoint.getLatitude(), info.latLonPoint.getLongitude()), 20));
                }
            }
        }

    8. 搜索页面的完整代码

    public class SearchAddressActivity extends AppCompatActivity implements View.OnClickListener, PoiSearch.OnPoiSearchListener, AdapterView.OnItemClickListener {
    
            private TextView search;
            private EditText content;
            private ListView listView;
            private SearchAdapter adapter;
            private ArrayList<SearchAddressInfo> mData = new ArrayList<>();
            private String searchText;
            private LatLonPoint lp;//
            private PoiResult poiResult; // poi返回的结果
            private List<PoiItem> poiItems;// poi数据
            private int currentPage = 0;// 当前页面,从0开始计数
            private PoiSearch.Query query;// Poi查询条件类
            private PoiSearch poiSearch;
            private String city;
            private ProgressDialog progressDialog;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_search_address);
    
                LatLng position = getIntent().getParcelableExtra("position");
                city = getIntent().getStringExtra("city");
                lp = new LatLonPoint(position.latitude, position.longitude);
    
                iniView();
            }
    
            private void iniView() {
                search = (TextView) findViewById(R.id.btn_search);
                content = (EditText) findViewById(R.id.input_edittext);
                listView = (ListView) findViewById(R.id.listview);
    
                search.setOnClickListener(this);
    
                adapter = new SearchAdapter(this, mData);
                listView.setAdapter(adapter);
    
                listView.setOnItemClickListener(this);
    
                progressDialog = new ProgressDialog(this);
    
                progressDialog.setMessage("搜索中...");
            }
    
            @Override
            public void onClick(View v) {
                if (v == search) {
                    dealSearch();
                }
            }
    
            private void dealSearch() {
                searchText = content.getText().toString().trim();
                if (TextUtils.isEmpty(searchText)) {
                    ToastUtil.show(this, "请输入搜索关键字");
                    return;
                } else {
                    progressDialog.show();
                    doSearchQueryByKeyWord(searchText);
                }
            }
    
            /**
             * 按照关键字搜索附近的poi信息
             *
             * @param key
             */
            protected void doSearchQueryByKeyWord(String key) {
                currentPage = 0;
                query = new PoiSearch.Query(key, "", city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
                query.setPageSize(20);// 设置每页最多返回多少条poiitem
                query.setPageNum(currentPage);// 设置查第一页
                query.setCityLimit(true); //限定城市
    
                if (lp != null) {
                    poiSearch = new PoiSearch(this, query);
                    poiSearch.setOnPoiSearchListener(this);   // 实现  onPoiSearched  和  onPoiItemSearched
                    poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));//
                    // 设置搜索区域为以latLonPoint点为圆心,其周围5000米范围
                    poiSearch.searchPOIAsyn();// 异步搜索
                }
            }
    
            @Override
            public void onPoiSearched(PoiResult result, int rcode) {
    
                progressDialog.dismiss();
    
                if (rcode == 1000) {
                    if (result != null && result.getQuery() != null) {// 搜索poi的结果
                        if (result.getQuery().equals(query)) {// 是否是同一条
                            poiResult = result;
                            poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
                            List<SuggestionCity> suggestionCities = poiResult
                                    .getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
    
                            if (poiItems.size() == 0) {
                                //没有搜到数据
                                ToastUtil
                                        .show(this, "对不起,没有搜索到相关数据!");
                                return;
                            }
                            mData.clear();
                            SearchAddressInfo addressInfo = null;
                            for (int i = 0; i < poiItems.size(); i++) {
                                PoiItem poiItem = poiItems.get(i);
                                if (i == 0) {
                                    addressInfo = new SearchAddressInfo(poiItem.getTitle(), poiItem.getSnippet(), true, poiItem.getLatLonPoint());
                                } else {
                                    addressInfo = new SearchAddressInfo(poiItem.getTitle(), poiItem.getSnippet(), false, poiItem.getLatLonPoint());
                                }
    
                                mData.add(addressInfo);
                            }
                            adapter.notifyDataSetChanged();
                        }
                    } else {
                        ToastUtil
                                .show(this, "对不起,没有搜索到相关数据!");
                    }
                } else {
                    ToastUtil
                            .show(this, "对不起,没有搜索到相关数据!");
                }
    
            }
    
            @Override
            public void onPoiItemSearched(PoiItem poiItem, int i) {
    
            }
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                Intent intent = new Intent();
                SearchAddressInfo addressInfo = mData.get(position);
                intent.putExtra("position", addressInfo);
                setResult(RESULT_OK, intent);
                finish();
            }
        }

    9. 最后阐述

    1. 看到这里,你想要的基本就能实现了

    2. 如果需要源码,关注微信公共号AppCode,回复:“位置源码”,即可获得源码下载链接。

    3. Demo apk下载链接

    4. 扫码即可关注我的微信公共号:AppCode

    展开全文
  • 由于需要通过iPhone手机上报校友的位置信息,需要iPhone手机地图显示世界各地的校友位置,所以对iOS平台的GPS与地图功能做了很深入的研究,最终顺利完成了校友位置上报与校友位置在地图标注的功能。...

         去年给清华大学水利系设计实现了一款iPhone手机上的校友会应用。由于需要通过iPhone手机上报校友的位置信息,需要在iPhone手机地图上显示世界各地的校友位置,所以对iOS平台的GPS与地图功能做了很深入的研究,最终顺利完成了校友位置上报与校友位置在地图上标注的功能。详情请参考:https://itunes.apple.com/cn/app/qing-hua-shui-li/id597204697?mt=8

        无独有偶,今年年初给几个朋友演示校友会时,他们对iPhone手机下的地图功能很感兴趣。原来他们是做电力设备监控的,他们的客户向他们提出能否在地图上直观看到设备的分布与设备运行状态?由于在iPhone手机上能够解决地图位置偏差的问题,于是我写了一个iPhone手机下的GPS地理位置采集工具给他们。该工具不仅可以采集实际卫星GPS地理位置,而且可以采集到偏差后的GPS地理位置。实际GPS地理位置可以用在桌面版本的Google地图上,偏差后的GPS地理位置可以准确地标注到Google地图手机版本或者是高德的地图上。他们通过该工具去现场采集设备位置,然后将这些设备GPS位置数据通过TXT或者CSV文件导出,就可以在监控系统中使用了。

       有个同学,他们主要做城市节能路灯电源的。他知道这个工具后,很感兴趣,觉得对他们公司很有用。因为他们总是遇到路灯坏了不能准确告诉维护检修人员路灯的具体位置,不仅维护人员工作强度大,而且维修不及时。通过GPS位置采集工具,让工程人员采集到所有路灯的位置,然后在后台服务器上的地图上标注。当路灯出现问题需要维护时,就能准确告诉维修人员需要维修路灯的准确位置。

       一次给一个同事演示这个工具,他说可以加入一个分享功能,通过短信或者邮件将位置发给他人,这样他人就可以知道发送者的位置。

       后来觉得用iPhone手机采集GPS地理位置以及位置分享这两个功能,存在不少的需求。
       行业上,随着移动互联网与物联网的发展,地理位置将会作为一个基本属性。例如做设备监控系统的企业,当要监控设备的量很大时,都会有采集设备的GPS准确位置然后在地图上直观标注的需求。个人方面,有时需要将自己的位置告诉别人。例如出门在外的孩子将位置告知父母,聚会地点的通知,出差在外的员工可以将位置分享给公司以防止意外,爱好旅游探险的记录线路等等。于是,将GPS位置采集与分享工具重新做了设计,做成了一个应用,上传到了APP Store。具体请参考:https://itunes.apple.com/cn/app/capture-gps-location/id610282087?mt=8 

    欢迎大家下载使用,欢迎交流,欢迎提出改进意见。我的QQ:1051094736








    展开全文
  • iPhone手机上的GPS位置共享应用

    万次阅读 2013-05-24 13:21:17
    今天上午出去办点事情,朝阳门内大街,看到一个拉着行李箱的美女,手里拿着iPhone手机那里好像焦急等待的样子,今天的天气真好,太阳直直的晒着。真想走过去问问美女是不是迷路了,或者是不是不知道怎么走了...

         今天上午出去办点事情,在朝阳门内大街,看到一个拉着行李箱的美女,手里拿着iPhone手机,在那里好像焦急等待的样子,今天的天气真好,太阳直直的晒着。我真想走过去问问美女是不是迷路了,或者是不是不知道怎么走了,或者不能告诉清楚朋友自己身处何地。但是我没有,怕被怀疑为另有所图。其实我真的是另有所图,就是想告诉该美女,如果迷路或者需要朋友来接自己,可以下载安装我的GPS Share应用然后就可以通过短信或者邮件告诉朋友你在哪儿了。

        写应用的人,应该都希望自己的应用被别人使用,给别人带来益处。我也不例外,恨不得每个手机都装上自己写的应用,这大概是职业习惯使然。

        在我提交上传了收费的GPS位置采集与分享后,我将GPS分享功能单独拿出来,做了一个免费不带有广告的应用上传到了APP Store。为什么要上传免费不带有广告的应用呢?上次雅安地震有个报道说是被埋在废墟下的一个人,曾经不断的打过求救电话,最终因没法确认他的具体被埋位置,没有能够得到及时救援。三天后找到他时,他已经永远的离去了。这个报道很沉重,很沉重。我想,如果他当时能够发送一条带有GPS位置信息的短信或者邮件,那么被及时救援的可能性就增加了不少。于是就上传了只分享GPS位置的应用。虽然现在让每个人能够发送自己的位置给别人,不太现实,因为不少人还没有用上智能手机。但几年后,或者若干年后,位置共享可能成为很方便的一个常用功能。

       在中国,由于手机地图都做了偏离处理,从卫星直接得到的GPS值标注到地图上时会有偏差。所以,GPSshare会两个地图链接,一个是通过手机上的Web Google地图打开,另外一个是通过桌面Web Google地图打开。目前该应用就是提供通过短信或者邮件将自己所处的位置的地图链接发给他人,他人通过地图链接就很方便在地图上看到发送者的位置。这个应用会一直更新下去,会做得更简洁,操作更方便,永远不嵌入广告。希望大家多提改进意见。

         GPSShare可以在iTunes下载安装,目前支持中英文界面。https://itunes.apple.com/cn/app/gps-share/id639167976?mt=8

    展开全文
  • iOS 发送位置消息

    千次阅读 2017-05-02 10:31:21
    发送地理位置在社交应用里面是很常用的需求。最近也需要在自己的应用里面加入这个功能首先我们需要获取自己的地理位置,这里用到 CLLocationManager 这个类,调用如下代码 locationManager = CLLocationManager() ...

    发送地理位置在社交应用里面是很常用的需求。最近也需要在自己的应用里面加入这个功能

    首先我们需要获取自己的地理位置,这里用到 CLLocationManager 这个类,调用如下代码

        locationManager = CLLocationManager()
        locationManager.requestAlwaysAuthorization()
        locationManager.delegate = self // 在成功获取位置后,就会把位置回调给 self
        locationManager.distanceFilter = kCLDistanceFilterNone
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation() // 在执行这个方法之后,系统就会不断获取手机所在的位置并且把这个位置回调给应用

    我们在回调方法里面获取该这个地理位置

      func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        locationManager.stopUpdatingLocation() // 注意这个地方需要关闭定位,不然会不断的回调这个方法
       manager.delegate = nil; // 不加这段代码可能还是会调用几次
        let location = locations[0]  //这个就是我们当前所在的位置   类型为:CLLocation ,里面包含了经度和纬度
      }

    如果要达到微信那种预览位置效果的话,我们需要通过位置获取一张截图, 因为我们不可能放一个 mapView 到消息列表上,这样内存肯定受不了。

    所以我们使用 MKMapSnapshotter, 这个类可以获取地图上的一小块截图,代码如下

        let mapShoot = MKMapSnapshotter(options: options)
        mapShoot.start { (mapshoot, error) in
          let image = mapshoot!.image  // 这就是我们需要的位置截图
          let finalImageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    
          // 如果想在地图上加入一个大头针,可以直接绘制上去,就像下面一样
          let pin = MKPinAnnotationView()
          let pinImage = pin.image
          UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale)
          image.draw(at: CGPoint(x: 0, y: 0))
          pinImage?.draw(at: CGPoint(x: finalImageRect.size.width/2, y: finalImageRect.size.height/2))
          let finalImage = UIGraphicsGetImageFromCurrentImageContext()
          self.locationDelegate.locationImageCallBack(location: location,image: finalImage)
        }

    之后的就只需要处理发送位置和接收位置消息了。 如果想看源码可以点击传送门 源码 在 dev 分支


    作者:HuminiOS - 极光

    原文:iOS 发送位置消息

    知乎专栏:极光日报

    展开全文
  • Android 如何发送地理位置消息

    千次阅读 2019-05-05 18:10:24
    今天分享一下如何 Android 上发送地理位置消息。最终效果是这样的: 点击地理位置消息,可以进入地图,并地图显示位置标志: 点击地理位置消息后的效果 接下来我们就来看看如何实现这一效果。 这...
  • C#发送手机短信

    千次阅读 2012-06-12 11:17:03
    通过编程方式实现短信息的发送对很多人来说是一件比较烦杂的事情,目前一般的解决方法是通过计算机和手机的连线,通过可对手机编程的语言编写相关的手机短信息程序来实现,而这种方法对于一般人来说是很难达到的,...
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家...
  • 手机发送短消息

    万次阅读 2006-02-17 11:25:00
    概述手机的短消息实现目前有三种方法: 1.通过移动网关发送短消息,使用该方法不需要附加的硬件,...电脑通过GSM MODEM向手机发送中文短消息,这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机,提供GSM
  • 后来发现,同样的代码,一点都不改,选择导出apk包到D盘,然后从D盘发送这个apk到手机上再运行,到指定位置就出错!不管是否签名,是否使用混淆都是一样的结果! 难道说直接从eclipse里用手机运行和先打包运行...
  • 手机位置服务

    2010-08-02 16:47:00
    现在的手机定位一般分为粗定位和高精度定位 粗定位主要用于工业行业,如物流跟踪,车辆管理,公共安全等。因为它提供的精度是小区,这取决与...最后把用户所在的小区位置发送给SP      <b
  • 利用手机基站获取位置

    万次阅读 2016-12-19 16:57:45
    正好项目中遇到了手机基站的一些原理,那今天就这里分享一下,现在穿戴设备这么发达,如果能有效地利用,说不定能对孩子及时的寻找,起到帮助,同时也是一大商机不是。什么是基站:简单的说就是我们打电话能连接的...
  • 高德地图实现仿qq,微信发送位置功能实现逻辑 公司最近要求框架添加发送位置逻辑,然而并没有数据库和后台写入这个方法,所以,只能做出demo样式,等待后台处理
  • 微信怎么定位对方的手机所在位置(偷偷定位微信好友位置)春天来了,人们都喜欢出门旅行,尤其节假日的时候,人多容易走散,如果对周围环境不熟悉,那么如何才能快速...一、发送位置微信怎么定位对方的手机所在位...
  • 1.发送手机验证码用的是网建的SMS接口(http://sms.webchinese.cn/) ...  注:SMS官网的建议还有要对手机号码次数进行限制:单个手机号码30分钟最多提交10次。(这个和IP限制次数方法是一样的,这里没加)
  • 前面的话:本文采用的是windows环境,工程是开源一小步之ESP32开发指南教程中的示例工程hx-tcp,主要是为了自己记录吧,如果有解决问题的注意一下。我在开发环境没问题的前提下进行了如下操作: 1. 将示例工程...
  • 手机端定位获取用户位置信息

    千次阅读 2018-07-10 17:48:00
    手机端定位获取用户位置信息 复制粘贴,发送到真实手机,用浏览器打开即可看到效果
  • PiaolinPlatformV2.0.0 - 获取手机或电脑GPS位置信息(定位平台) 前言 飘零定位平台于 2019/02/07 正式上线第一代(地址),上线后反响良好,每日都有新增用户,但由当时技术水平限制,后续运营难以接续以及平台扩展...
  • c#实现手机短信发送(1)

    千次阅读 2008-01-15 11:17:00
    C#利用Web Service实现短信发送(1)作者: 出处:中文C#技术站 ( 2 ) 砖 ( 4 ) 好 评论 ( 1 ) 条 进入论坛 更新时间:2006-07-26 11:43关 键 词:C# Web Service 短信阅读提示:通过编程方式实现短信息的...
  • 手机位置相关知识——HLR和VLR

    千次阅读 2014-09-23 17:56:03
    我在北京的号,到上海怎么识别?HLR(home location register)保存的是用户的基本信息,如你的SIM的卡号、手机号码、签约信息等,和动态信息,如当前的位置、是否已经关机等;VLR(visiting location register)...
  • 为了满足使用百度地图的开发者,本篇文档对如何 sdk 2.8.0 以上实现百度地图发送地理位置消息做讲解。 效果图 集成前准备 注册百度地图开放平台,可能需要审核开发者身份 创建 Android 应用, 生成 sha1 码获取...
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文
  •  微信任意聊天窗口输入 //pickpoi 并发送,可以快速定位自己当前的位置!当然这也与微信中的“发送位置”的功能是基本一致的。  怎么样?是不是快多了?去玩一下熟悉熟悉吧,以便不时之需。 ...
  • 本篇主要记录实现这个功能时,遇到的一些问题以及解决,具体的实现代码在下篇文章中贴出 首先看下效果图: 主要功能(参照微信发送定位): 1.定位所在位置并且展示周边POI(建筑物等信息);...
  • I9003静态图片的位置及蓝牙发送

    千次阅读 2011-05-20 09:15:00
    凭着经验用91助手在手机的各种目录中寻找,终于找到了。system/app/TwWallpaperChooser.apk,就是这个程序,下到电脑中来,解压后,TwWallpaperChooser/res/drawable-hdpi目录下就是咱想要的图片了。
  • 近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限,还请大家...
  • 如何获取手机用户的位置信息

    千次阅读 2012-10-19 10:28:50
    移动互联网会充分挖掘用户的位置信息并这点展开一系列非常新奇的应用和体验,谷歌这点走了前面。以前一直以为谷歌是跟中国移动合作取得的数据,看了下面这篇文章才明白了谷歌原来是“偷”来的数据。转...
  • 一次,我们说到了,如果我们的sim卡被人换掉了,那么就会发送一条短信到我们的原来设定的安全号码那里的,而今天,我们就要获取到手机位置啦,以便追踪回手机。 我们是这样设计的,我们通过发送一条短信,短信的...
  • 电脑开机自动发送短信到手机

    千次阅读 2011-10-06 10:34:11
    :: sno 为自己手机号;psw 为飞信密码 ;msg 为消息 set sno=13888888888 set psw=12345678 set msg=服务器已开机 请注意 mshta ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,961
精华内容 29,984
关键字:

在手机上怎么发送自己的位置