- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写跟踪 map 。在我想要分配的 getDeviceLocation 方法中:
prevLat=mLastKnownLocation.getLatitude();
prevLng=mLastKnownLocation.getLongitude();
但它会使应用程序崩溃。我想稍后在 distanceBetween() 中为我们分配它,以在每次位置更改后获取距离。当通过killApp()关闭 Activity 时,它应该总结所有距离并给出总数。它还会使应用程序崩溃,因此已对其进行了评论。
整个 Activity :
package com.example.micha.aplikacjatreningowa;
import android.Manifest;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.view.View;
import android.widget.Button;
import android.support.v4.app.DialogFragment;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
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.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import static android.location.Location.distanceBetween;
import static java.lang.Math.pow;
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback, com.google.android.gms.location.LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = MapActivity.class.getSimpleName();
private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private CameraPosition mCameraPosition;
private static final int DEFAULT_ZOOM = 20;
private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
private boolean mLocationPermissionGranted = false;
private Location mLastKnownLocation;
private static final String KEY_CAMERA_POSITION = "camera_position";
private static final String KEY_LOCATION = "location";
private static final int UPDATE_INTERVAL = 1000;
private static final int FASTEST_INTERVAL = 500;
private static final int DISPLACEMENT = 1;
public double prevLat;
public double prevLng;
float totalDistance;
float[] distance;
float[] cBurned;
Float totalCalories;
public Button End;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Ustalanie mapy
setContentView(R.layout.activity_map);
//Budowanie klienta API do użytku w wyznaczaniu położenia
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addConnectionCallbacks(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
createLocationRequest();
endButton();
}
//Zapisuje stan aplikacji
protected void onSaveInstanceState(Bundle outState) {
if (mMap != null) {
outState.putParcelable(KEY_CAMERA_POSITION, mMap.getCameraPosition());
outState.putParcelable(KEY_LOCATION, mLastKnownLocation);
super.onSaveInstanceState(outState);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
//Gdy połączenie się nie uda
public void onConnectionFailed(@NonNull ConnectionResult result) {
Log.d(TAG, "Połączenie nieudane: ConnectionResult.getErrorCode() = " + result.getErrorCode());
}
//Gdy połączenie zostanie wstrzymane
public void onConnectionSuspended() {
Log.d(TAG, "Połączenie wstrzymane");
}
//Pobieranie lokacji użytkownika
private void getDeviceLocation() {
//Prośba o pozwolenie na zczytanie lokacji urządzenia
if (ContextCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
//Pobranie lokacji urządzenia
if (mLocationPermissionGranted) {
mLastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if(mLastKnownLocation != null) {
prevLat=mLastKnownLocation.getLatitude();
prevLng=mLastKnownLocation.getLongitude();
}
}
moveCamera();
}
//Po otrzymaniu pozwolenia
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
mLocationPermissionGranted = false;
switch (requestCode) {
case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
}
}
}
updateLocationUI();
}
//Gdy mapa jest już gotowa
@Override
public void onMapReady(GoogleMap map) {
mMap=map;
updateLocationUI();
getDeviceLocation();
startLocationUpdates();
}
private void updateLocationUI() {
if (mMap == null) {
return;
}
if (ContextCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
if (mLocationPermissionGranted) {
mMap.setMyLocationEnabled(true);
} else {
mMap.setMyLocationEnabled(false);
mLastKnownLocation = null;
}
}
protected void startLocationUpdates() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onLocationChanged(Location location) {
moveCamera();
float velocity = location.getSpeed();
float caloriesBurned;
String extra = getIntent().getStringExtra("EXTRA_MODE_TYPE");
switch (extra) {
case"walk": {
distanceBetween(prevLat, prevLng, location.getLatitude(), location.getLongitude(), distance);
prevLat=location.getLatitude();
prevLng=location.getLongitude();
double dbcaloriesBurned =(0.0215*pow(velocity*3600/1000, 3)-0.1765*pow(velocity*3600/1000, 2)+0.8710* + 1.4577*velocity*3600/1000);
caloriesBurned = (float)dbcaloriesBurned;
int count = 0;
cBurned[count] = caloriesBurned;
count++;
if (velocity > 2) {
killApp();
}
break;
}
case "run": {
distanceBetween(prevLat, prevLng, location.getLatitude(), location.getLongitude(), distance);
prevLat = location.getLatitude();
prevLng = location.getLongitude();
double dbcaloriesBurned = (0.0215 * pow(velocity * 3600 / 1000, 3) - 0.1765 * pow(velocity * 3600 / 1000, 2) + 0.8710 * +1.4577 * velocity * 3600 / 1000);
caloriesBurned = (float) dbcaloriesBurned;
int count = 0;
cBurned[count] = caloriesBurned;
count++;
if (velocity > 3) {
killApp();
}
break;
}
case "ride": {
distanceBetween(prevLat, prevLng, location.getLatitude(), location.getLongitude(), distance);
prevLat = location.getLatitude();
prevLng = location.getLongitude();
double dbcaloriesBurned = (0.0215 * pow(velocity * 3600 / 1000, 3) - 0.1765 * pow(velocity * 3600 / 1000, 2) + 0.8710 * +1.4577 * velocity * 3600 / 1000);
caloriesBurned = (float) dbcaloriesBurned;
int count = 0;
cBurned[count] = caloriesBurned;
count++;
if (velocity > 5) {
killApp();
}
break;
}
}
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
}
public void endButton(){
End = (Button)findViewById(R.id.End);
End.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
killApp();
}
});
}
public void moveCamera() {
if (mCameraPosition != null) {
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition));
} else if (mLastKnownLocation != null) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLastKnownLocation.getLatitude(),
mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
}
}
public void killApp() {
stopLocationUpdates();
/*for(int i=0; i<=distance.length; i++) {
totalDistance += distance[i];
}
for(int j=0; j<cBurned.length; j++) {
totalCalories += cBurned[j];
}*/
AlertDialog.Builder builder = new AlertDialog.Builder(MapActivity.this);
builder.setMessage("Koniec treningu!\nPrzebiegłeś: " + totalDistance +" metrów.\nSpaliłeś: " + totalCalories +" kalorii.")
.setCancelable(false)
.setPositiveButton("Zakończ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.create().show();
}
protected void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
}
@Override
public void onConnectionSuspended(int i) {
}
}
编辑:崩溃日志:
--------- beginning of crash
05-24 22:16:57.509 2930-2930/com.example.micha.aplikacjatreningowa E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.micha.aplikacjatreningowa, PID: 2930
java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at com.google.android.gms.internal.zzase$zza$zza.zza(Unknown Source)
at com.google.android.gms.internal.zzasg.zza(Unknown Source)
at com.google.android.gms.internal.zzash.zza(Unknown Source)
at com.google.android.gms.internal.zzary$1.zza(Unknown Source)
at com.google.android.gms.internal.zzary$1.zza(Unknown Source)
at com.google.android.gms.internal.zzaad$zza.zzb(Unknown Source)
at com.google.android.gms.internal.zzaaq.zze(Unknown Source)
at com.google.android.gms.internal.zzaaq.zzb(Unknown Source)
at com.google.android.gms.internal.zzaav.zzb(Unknown Source)
at com.google.android.gms.internal.zzaat.zzb(Unknown Source)
at com.google.android.gms.internal.zzary.requestLocationUpdates(Unknown Source)
at com.example.micha.aplikacjatreningowa.MapActivity.startLocationUpdates(MapActivity.java:187)
at com.example.micha.aplikacjatreningowa.MapActivity.onMapReady(MapActivity.java:156)
at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzt$zza.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.internal.bw.a(:com.google.android.gms.DynamiteModulesB:82)
at com.google.maps.api.android.lib6.impl.bf.run(:com.google.android.gms.DynamiteModulesB:1805)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
编辑 2:应用程序因 startLocationUpdates() 方法而崩溃
最佳答案
您没有正确处理 Android 运行时权限,因为您在条件满足时请求权限Manifest.permission.ACCESS_FINE_LOCATION == PackageManager.PERMISSION_GRANTED
为 true。再检查一次您的代码。
你应该这样做:
String permission = Manifest.permission.ACCESS_FINE_LOCATION;
if (!isPermissionGranted(permission)) {
if (isRationaleExplanationNeeded(permission)) {
//show dialog to explain why you need permission
} else {
ActivityCompat.requestPermissions(this, new String[]{permission},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
} else {
//do what ever you need to do
}
我假设您由于未获得许可而收到安全异常。
上面调用的函数:
private boolean isPermissionGranted(String permission) {
int hasRequestedPermission = ContextCompat.checkSelfPermission(this, permission);
return hasRequestedPermission == PackageManager.PERMISSION_GRANTED;
}
private boolean isRationaleExplanationNeeded(String permission) {
return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
}
关于java - 将 getLatitude() 分配给变量时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44168305/
Android 的 location.getLatitude() 方法是否提供大地纬度或地心纬度? 如果是大地测量,它是基于 WGS84 还是 GR80 椭球体? API 规范令人惊讶地缺乏,它只声明
我是编程新手,正在学习 Google Location API 教程。我已正确执行所有步骤,但是,以下代码在 getlatitude() 和 getlongitude() 处给我错误。错误:无法解析方
我正在编写跟踪 map 。在我想要分配的 getDeviceLocation 方法中: prevLat=mLastKnownLocation.getLatitude(); prevLng=mLastK
我收到以下运行时错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“double android.location.Location.getLatitu
我正在开发一个应用程序,只要您单击获取位置 (gpsBtn),GPS 就会启用,用户的位置将显示在 TextView 中。我收到 java.lang.NullPointerException 错误,应
我正在处理的 Android 应用程序有问题。该应用程序工作正常,直到我添加了两行代码来获取用户的纬度和经度。当我添加此代码时,我的应用程序无缘无故崩溃。这是带有 getLatitude 和 getL
这个问题在这里已经有了答案: Android getlastknownlocation returns null (1 个回答) 关闭 9 年前。 我在这一行收到一个空指针异常: double la
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 4 年前。 请您解释一下为什么 getLon
这个问题在这里已经有了答案: What is a NullPointerException, and how do I fix it? (12 个答案) 关闭 8 年前。 我正在尝试获取当前的纬度和
我真的遇到了这个错误,已经尝试了我能想到的一切来避免 getLatitude 方法上的 NPE... 有人可以检查我的代码并推荐解决方案吗? 只有当我在纬度和经度的某些坐标中进行硬编码时,它才有效,但
我有一种方法可以在 map 上显示设备的当前位置。我使用 FusedLocationProviderClient 因为它似乎是最准确的。 在 currentLocation.getLatitude()
如何将 getLongitude() 和 getLatitude() 的值转换为 EditText 可以接受的格式? 如果我像这样把它们放到 Toast 中就可以了 String message =
状态:大约一周后接受最佳可用答案并表示感谢。等待/邀请更多答案并引用 这件事很复杂。我真的很感谢所有评论员,特别是 asciimo、Gabe Sechan、AlexWien。请在适当研究后进一步投票和
为什么我不知道,我犯了这个错误。程序之前运行过。但现在我犯了这个错误。谢谢你的帮助... MenuActivity.java: final Context context = this; privat
所以我整天都在为此工作,我快要失去理智了。我正在尝试从谷歌的位置 api 获取坐标,以便从另一个 api (forcast.io) 获取天气。我的代码已经达到这样的程度,即 google api 正在
我一直在寻找答案,但也许我只是没有使用正确的术语。我正在创建一个应用程序,它将访问数据库以返回距用户位置一定距离内的其他用户的列表。我从未使用过此类数据,而且我真的不知道这些值的含义。我想使用 MyS
我正在尝试使用 openstreetmap osmosis 读取机场的 pbf 文件并提取登机口和跑道等特征。 我使用的代码类似于:http://www.javaoptimum.com/how-to-
我想要做的就是让用户获得他喜欢的类型的位置列表。例如,如果输入是医院,我的应用程序将使用搜索字符串“医院”打开谷歌地图。但正如文档中所建议的那样,使用像 geo:0,0?q=hospital 这样的地
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 5 年前。 我正在 android 中创建一
当我使用 Mapbox 时,我遇到了与 GPS 相关的问题。 public class MainActivity extends AppCompatActivity implements OnMapR
我是一名优秀的程序员,十分优秀!