最近开始学习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();
}
}
}
至此已可以实现基本定位功能,未完待续~