GPS 地图不要撒播它
GPS Maps dont sowt it
我正在做一个应用程序 gps 以在地图中定位我,所以我使用 phone 和 android 版本 8.1,它毫无问题地安装在我的 phone 中, 买不给我看地图。
锁就像它在我的 phone 中显示的那样:
这是我的build.gradle(模块应用)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.ejemplogpsmaps"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
implementation 'com.google.android.gms:play-services-maps:16.1.0'
}
这是我的activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvMensaje"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:text="Ubicacion"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<fragment
android:id="@+id/fragment"
android:name="com.example.ejemplogpsmaps.FragmentMaps"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvMensaje" />
</android.support.constraint.ConstraintLayout>
这个MainActivity.Java
package com.example.ejemplogpsmaps;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tvMensaje;
// Minimo tiempo para updates en Milisegundos
private static final long MIN_TIME = 10000; // 10 segundos
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMensaje = findViewById(R.id.tvMensaje);
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
} else {
iniciarLocalizacion();
}
}
private void iniciarLocalizacion() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Localizacion local = new Localizacion();
local.setMainActivity(this, tvMensaje);
final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(!gpsEnabled) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
return;
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, 0, local);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, 0, local);
tvMensaje.setText("Localizacion agregada");
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[]grantResults) {
if(requestCode == 1000) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
iniciarLocalizacion();
return;
}
}
}
}
第 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ejemplogpsmaps">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="UNY GPS"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="I hide my key" />
</application>
</manifest>
为了安全起见,我把钥匙藏起来了API。
这个FragmentMaps.java
package com.example.ejemplogpsmaps;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.UiSettings;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class FragmentMaps extends SupportMapFragment implements OnMapReadyCallback {
double lat, lon;
public FragmentMaps() { }
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
View rootView = super.onCreateView(layoutInflater, viewGroup, bundle);
if(getArguments() != null) {
this.lat = getArguments().getDouble("lat");
this.lon = getArguments().getDouble("lon");
}
getMapAsync(this);
return rootView;
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng latLng = new LatLng(lat, lon);
float zoom = 17;
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
googleMap.getUiSettings().setZoomControlsEnabled(true);
googleMap.addMarker(new MarkerOptions().position(latLng));
UiSettings settings = googleMap.getUiSettings();
settings.setZoomControlsEnabled(true);
}
}
这个localizacion.java
package com.example.ejemplogpsmaps;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView;
public class Localizacion implements LocationListener {
MainActivity mainActivity;
TextView tvMensaje;
public MainActivity getMainActivity() {
return mainActivity;
}
public void setMainActivity(MainActivity mainActivity, TextView tvMensaje) {
this.mainActivity = mainActivity;
this.tvMensaje = tvMensaje;
}
@Override
public void onLocationChanged(Location location) {
// Este metodo se ejecuta cuando el GPS recibe nuevas coordenadas
String texto = "Mi ubicación es: \n"
+ "Latitud = " + location.getLatitude() + "\n"
+ "Longitud = " + location.getLongitude();
tvMensaje.setText(texto);
mapa(location.getLatitude(), location.getLongitude());
}
public void mapa(double lat, double lon) {
// Fragment del Mapa
FragmentMaps fragment = new FragmentMaps();
Bundle bundle = new Bundle();
bundle.putDouble("lat", new Double(lat));
bundle.putDouble("lon", new Double(lon));
fragment.setArguments(bundle);
FragmentManager fragmentManager = getMainActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment, fragment, null);
fragmentTransaction.commit();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
case LocationProvider.AVAILABLE:
Log.d("debug", "LocationProvider.AVAILABLE");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
break;
}
}
@Override
public void onProviderEnabled(String provider) {
tvMensaje.setText("GPS Activado");
}
@Override
public void onProviderDisabled(String provider) {
tvMensaje.setText("GPS Desactivado");
}
}
所以,我像 Google 地图 Activity 创建了这个项目并添加
在 AndroidManifest.xml.
中访问精确位置的权限
所以你可以帮助我,我不理解
解决方案正在更改 API_KEY,我创建了一个新密钥并粘贴到此处:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="NEW_API_key" />
我正在做一个应用程序 gps 以在地图中定位我,所以我使用 phone 和 android 版本 8.1,它毫无问题地安装在我的 phone 中, 买不给我看地图。
锁就像它在我的 phone 中显示的那样:
这是我的build.gradle(模块应用)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.ejemplogpsmaps"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
implementation 'com.google.android.gms:play-services-maps:16.1.0'
}
这是我的activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvMensaje"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:text="Ubicacion"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<fragment
android:id="@+id/fragment"
android:name="com.example.ejemplogpsmaps.FragmentMaps"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvMensaje" />
</android.support.constraint.ConstraintLayout>
这个MainActivity.Java
package com.example.ejemplogpsmaps;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tvMensaje;
// Minimo tiempo para updates en Milisegundos
private static final long MIN_TIME = 10000; // 10 segundos
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMensaje = findViewById(R.id.tvMensaje);
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
} else {
iniciarLocalizacion();
}
}
private void iniciarLocalizacion() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Localizacion local = new Localizacion();
local.setMainActivity(this, tvMensaje);
final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(!gpsEnabled) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
return;
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, 0, local);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, 0, local);
tvMensaje.setText("Localizacion agregada");
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[]grantResults) {
if(requestCode == 1000) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
iniciarLocalizacion();
return;
}
}
}
}
第 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ejemplogpsmaps">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="UNY GPS"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="I hide my key" />
</application>
</manifest>
为了安全起见,我把钥匙藏起来了API。
这个FragmentMaps.java
package com.example.ejemplogpsmaps;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.UiSettings;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class FragmentMaps extends SupportMapFragment implements OnMapReadyCallback {
double lat, lon;
public FragmentMaps() { }
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
View rootView = super.onCreateView(layoutInflater, viewGroup, bundle);
if(getArguments() != null) {
this.lat = getArguments().getDouble("lat");
this.lon = getArguments().getDouble("lon");
}
getMapAsync(this);
return rootView;
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng latLng = new LatLng(lat, lon);
float zoom = 17;
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
googleMap.getUiSettings().setZoomControlsEnabled(true);
googleMap.addMarker(new MarkerOptions().position(latLng));
UiSettings settings = googleMap.getUiSettings();
settings.setZoomControlsEnabled(true);
}
}
这个localizacion.java
package com.example.ejemplogpsmaps;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView;
public class Localizacion implements LocationListener {
MainActivity mainActivity;
TextView tvMensaje;
public MainActivity getMainActivity() {
return mainActivity;
}
public void setMainActivity(MainActivity mainActivity, TextView tvMensaje) {
this.mainActivity = mainActivity;
this.tvMensaje = tvMensaje;
}
@Override
public void onLocationChanged(Location location) {
// Este metodo se ejecuta cuando el GPS recibe nuevas coordenadas
String texto = "Mi ubicación es: \n"
+ "Latitud = " + location.getLatitude() + "\n"
+ "Longitud = " + location.getLongitude();
tvMensaje.setText(texto);
mapa(location.getLatitude(), location.getLongitude());
}
public void mapa(double lat, double lon) {
// Fragment del Mapa
FragmentMaps fragment = new FragmentMaps();
Bundle bundle = new Bundle();
bundle.putDouble("lat", new Double(lat));
bundle.putDouble("lon", new Double(lon));
fragment.setArguments(bundle);
FragmentManager fragmentManager = getMainActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment, fragment, null);
fragmentTransaction.commit();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
case LocationProvider.AVAILABLE:
Log.d("debug", "LocationProvider.AVAILABLE");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
break;
}
}
@Override
public void onProviderEnabled(String provider) {
tvMensaje.setText("GPS Activado");
}
@Override
public void onProviderDisabled(String provider) {
tvMensaje.setText("GPS Desactivado");
}
}
所以,我像 Google 地图 Activity 创建了这个项目并添加 在 AndroidManifest.xml.
中访问精确位置的权限所以你可以帮助我,我不理解
解决方案正在更改 API_KEY,我创建了一个新密钥并粘贴到此处:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="NEW_API_key" />