安裝最新版Android Studio 3.2版本
建立一個專案
設定API 22:Android 5.1 (L)版本
開啟google map 專案
Google Maps API kml
裡有一串註解
<!--
TODO: Before you run your application, you need a Google Maps API key.
To get one, follow this link, follow the directions and press "Create" at the end:
https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=我的專案的資料
You can also add your credentials to an existing key, using these values:
Package name:
F5:87:76:41:94:C3:3B:84:5B:C1:7C:BA:73:B2:D7:13:1D:96:C7:7C
SHA-1 certificate fingerprint:
F5:87:76:41:94:C3:3B:84:5B:C1:7C:BA:73:B2:D7:13:1D:96:C7:7C
Alternatively, follow the directions here:
https://developers.google.com/maps/documentation/android/start#get-key
Once you have your key (it starts with "AIza"), replace the "google_maps_key"
string in this file.
-->
點擊連結後 我新增了一個key
下方是
有我的KEY
build.grade 設定是這樣
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.shijung.travel"
minSdkVersion 22
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.google.android.gms:play-services-location:15.0.1'
implementation 'com.google.android.gms:play-services-maps:15.0.1'
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'
}
加入了要用的 google 的東西 也按了sync 運作是成功的
但卻沒有地圖
我的code
MapsActivity.java
package com.shijung.travel;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private static int LOCATION_PERMISSION_REQUEST_CODE = 1001;
private static boolean rLocationGranted = false;
private FusedLocationProviderClient mFusedLocationProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
if (chkPlayService()) {
initialMap();
if (rLocationGranted) {
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//super.onRequestPermissionsResult(requestCode, permissions, grantResults);
rLocationGranted = false;
switch (requestCode) {
case 1001:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
rLocationGranted = false;
return;
}
}
rLocationGranted = true;
}
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
rLocationGranted = false;
//map initial;
}
if (grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
rLocationGranted = true;
//map initial;
}
}
}
private void initialMap() {
String[] permissioins = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
if ((ContextCompat.checkSelfPermission(this.getApplicationContext(), permissioins[0])
== PackageManager.PERMISSION_GRANTED) ||
(ContextCompat.checkSelfPermission(this.getApplicationContext(), permissioins[1])
== PackageManager.PERMISSION_GRANTED)) {
//可以取得 FINE LOCATION
rLocationGranted = true;
} else {
ActivityCompat.requestPermissions(this, permissioins,
LOCATION_PERMISSION_REQUEST_CODE);
}
}
private void getDeviceLocation() {
mFusedLocationProvider = LocationServices.getFusedLocationProviderClient(this);
try {
if (rLocationGranted) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Task location = mFusedLocationProvider.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if(task.isSuccessful()){
Location mLocation = (Location) task.getResult();
mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(mLocation.getLatitude(),mLocation.getLongitude())));
}
}
});
}
//if(ActivityCompat.checkSelfPermission((this,Manifest.permission.ACCESS_FINE_LOCATION))
}catch(Exception ex){
Log.e("Location Error",ex.getMessage());
}
}
private boolean chkPlayService(){
int avai = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(MapsActivity.this);
if(avai ==ConnectionResult.SUCCESS){
Log.i("Map Test","Version is Fine");
return true;
}else{
Toast.makeText(this,"版本不符合,無法執行MAP",Toast.LENGTH_LONG).show();
return false;
}
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
getDeviceLocation();
// Add a marker in Sydney and move the camera
//LatLng sydney = new LatLng(-34, 151);
// mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
//mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}