Arcgis Android 定位

最近开始学习arcgis android开发,从最基本的定位开始来完善一个demo吧~

1.首先是开发环境:

IDE: android studio 3.0.1

2.接下来是依赖项配置,这里采用在线模式配置:

2.1配置project的build.gradle,在allprojects的repositories下添加

maven {
                url 'http://dl.bintray.com/esri/arcgis'
            }
添加完成后完整的代码如下:

buildscript {

    repositories {
        google()
        jcenter()
    }

    dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'

            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }

    allprojects {
        repositories {
            google()
            jcenter()

            maven {
                url 'http://dl.bintray.com/esri/arcgis'
            }

        }
    }

    task clean(type: Delete) {
        delete rootProject.buildDir
    }

2.2配置module的build.gradle,指定使用的arcgis sdk版本

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:25.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    compile 'com.esri.arcgis.android:arcgis-android:10.2.6-2'

}

2.3配置无需打包项

packagingOptions{
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

完整的build.gradle如下

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    defaultConfig {
        applicationId "com.ovit.arcgis_test"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions{
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:25.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    compile 'com.esri.arcgis.android:arcgis-android:10.2.6-2'

}

3.修改activity布局文件




    
    

4.设置基类BaseActivity

import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.esri.android.map.LocationDisplayManager;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.core.geometry.GeometryEngine;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.SpatialReference;

/**
 * Created by 此生无分起相思 on 2018/6/1.
 */

public class BaseActivity extends AppCompatActivity
{
    String strMapUrl="http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer";
    private MapView mapView = null;
    private ArcGISTiledMapServiceLayer arcGISTiledMapServiceLayer = null;

    public void initMap()  //初始化地图并完成定位
    {
        this.mapView = (MapView)findViewById(R.id.map);
        this.arcGISTiledMapServiceLayer = new ArcGISTiledMapServiceLayer(strMapUrl);
        this.mapView.addLayer(arcGISTiledMapServiceLayer);  //加载地图图层

        LocationDisplayManager locationDisplayManager =  mapView.getLocationDisplayManager();//获取定位类
        locationDisplayManager.setShowLocation(true);
        locationDisplayManager.setAutoPanMode(LocationDisplayManager.AutoPanMode.LOCATION);
        /***  LocationDisplayManager.AutoPanMode: 设置模式 自动定位到当前位置
         * (1) COMPASS:定位到你所在的位置(作为中心位置显示)并按照手机所指向的方向旋转地图(非行驶状态)。
          (2)LOCATION:自动定位到你的位置(作为中心位置显示)
          (3)NAVIGATION:默认情况下,这将图标放置在屏幕底部,并将地图旋转至行驶的方向。
         (4)OFF:不会自动定位,它只会简单地显示地图(默认)*/
        locationDisplayManager.setShowPings(true);
        locationDisplayManager.start();//开始定位
    }

    /*----------------------------Toast显示提示框----------------------------------*/
    public void show(String t)
    {
        Toast.makeText(getApplicationContext(), t, Toast.LENGTH_LONG).show();
    }
/*----------------------------Toast显示提示框----------------------------------*/

    /*----------------------------android 6.0定位权限申请----------------------------------------------------*/
    BaseActivity activity = this;    //获得activity
    private static final int Location_Permission = 0; //约定位置权限代码为0

    public void requestPermission()
    {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {  //询问用户是否拒绝过,如果没有,该方法返回false,如果被拒绝过,该方法返回true
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION))
            { // 用户拒绝过这个权限了,应该提示用户,为什么需要这个权限
                new AlertDialog.Builder(this).setTitle("提示:").setMessage("没有定位权限将不能获取当前位置 请完成授权")
                        .setPositiveButton("同意", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                dialog.cancel();  // 用户同意申请 重新申请权限
                                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, Location_Permission);
                            }
                        })
                        .setNegativeButton("拒绝", new DialogInterface.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel(); // 用户拒绝申请
                            }
                        }).show();
            }

            else {  // 申请授权。
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, Location_Permission);
            }
        }
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)  //权限申请的回调方法
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == Location_Permission)
        {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //权限被用户同意,做相应的事情
                initMap();
            } else {
                //权限被用户拒绝,做相应事情
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

}

5.设置MapActivity

import android.os.Build;
import android.os.Bundle;

public class MapActivity extends BaseActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        if (Build.VERSION.SDK_INT >= 23)
        {
            requestPermission();
        }else{
            initMap();
        }

    }

}
至此已可以实现基本定位功能,未完待续~

你可能感兴趣的:(Android)