java – 在空对象引用上调用虚方法’double android.location.Location.getLatitude()’时出错
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在空对象引用上调用虚方法’double android.location.Location.getLatitude()’时出错,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11508字,纯文字阅读大概需要17分钟。
内容图文
![java – 在空对象引用上调用虚方法’double android.location.Location.getLatitude()’时出错](/upload/InfoBanner/zyjiaocheng/715/d5703191632e47af8a9c577f99408b44.jpg)
我所要做的就是让用户获得他喜欢的类型的列表.例如,如果输入是医院,我的应用程序将使用搜索字符串“Hospital”打开谷歌地图.但正如文档中使用地理编码所建议的那样地理代码:0,0?q = hospital uri显示坐标0纬度附近的所有医院. 0经度.因此,当我尝试使用以下代码首先获取用户坐标时.
放置Decoder.java
package com.kkze.Mappy;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
public class PlacesDecoder extends Activity {
Intent intentThatCalled;
public double latitude;
public double longitude;
public LocationManager locationManager;
public Criteria criteria;
public String bestProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
intentThatCalled = getIntent();
String voice2text = intentThatCalled.getStringExtra("v2txt");
getLocation(voice2text);
}
public static boolean isLocationEnabled(Context context)
{
int locationMode = 0;
String locationProviders;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
try
{
locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return locationMode != Settings.Secure.LOCATION_MODE_OFF;
}
else
{
locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
return !TextUtils.isEmpty(locationProviders);
}
}
public void getLocation(String voice2txt) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
criteria = new Criteria();
bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString();
Location location = locationManager.getLastKnownLocation(bestProvider);
if (isLocationEnabled(PlacesDecoder.this)) {
Log.e("TAG", "GPS is on");
latitude = location.getLatitude();
longitude = location.getLongitude();
Toast.makeText(PlacesDecoder.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
searchNearestPlace(voice2txt);
}
else
{
AlertDialog.Builder notifyLocationServices = new AlertDialog.Builder(PlacesDecoder.this);
notifyLocationServices.setTitle("Switch on Location Services");
notifyLocationServices.setMessage("Location Services must be turned on to complete this action. Also please take note that if on a very weak network connection, such as 'E' Mobile Data or 'Very weak Wifi-Connections' it may take even 15 mins to load. If on a very weak network connection as stated above, location returned to application may be null or nothing and cause the application to crash.");
notifyLocationServices.setPositiveButton("Ok, Open Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent openLocationSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
PlacesDecoder.this.startActivity(openLocationSettings);
finish();
}
});
notifyLocationServices.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
notifyLocationServices.show();
}
}
public void searchNearestPlace(String v2txt) {
Log.e("TAG", "Started");
v2txt = v2txt.toLowerCase();
String[] placesS = {"accounting", "airport", "aquarium", "atm", "attraction", "bakery", "bakeries", "bank", "bar", "cafe", "campground", "casino", "cemetery", "cemeteries", "church", "courthouse", "dentist", "doctor", "electrician", "embassy", "embassies", "establishment", "finance", "florist", "food", "grocery", "groceries", "supermarket", "gym", "health", "hospital", "laundry", "laundries", "lawyer", "library", "libraries", "locksmith", "lodging", "mosque", "museum", "painter", "park", "parking", "pharmacy", "pharmacies", "physiotherapist", "plumber", "police", "restaurant", "school", "spa", "stadium", "storage", "store", "synagog", "synagogue", "university", "universities", "zoo"};
String[] placesM = {"amusement park", "animal care", "animal care", "animal hospital", "art gallery", "art galleries", "beauty salon", "bicycle store", "book store", "bowling alley", "bus station", "car dealer", "car rental", "car repair", "car wash", "city hall", "clothing store", "convenience store", "department store", "electronics store", "electronic store", "fire station", "funeral home", "furniture store", "gas station", "general contractor", "hair care", "hardware store", "hindu temple", "home good store", "homes good store", "home goods store", "homes goods store", "insurance agency", "insurance agencies", "jewelry store", "liquor store", "local government office", "meal delivery", "meal deliveries", "meal takeaway", "movie rental", "movie theater", "moving company", "moving companies", "night club", "pet store", "place of worship", "places of worship", "post office", "real estate agency", "real estate agencies", "roofing contractor", "rv park", "shoe store", "shopping mall", "subway station", "taxi stand", "train station", "travel agency", "travel agencies", "veterinary care"};
int index;
for (int i = 0; i <= placesM.length - 1; i++) {
Log.e("TAG", "forM");
if (v2txt.contains(placesM[i])) {
Log.e("TAG", "sensedM?!");
index = i;
Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesM[index]);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
finish();
}
}
for (int i = 0; i <= placesS.length - 1; i++) {
Log.e("TAG", "forS");
if (v2txt.contains(placesS[i])) {
Log.e("TAG", "sensedS?!");
index = i;
Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesS[index]);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
finish();
}
}
}
}
问题是始终和始终位置返回null.而且我知道,只要启用了位置,另一个应用程序Jarvis就可以轻松完成任务,如果不是,则只是要求用户.但在相同的条件下,我的应用程序总是崩溃.
我做了什么:
>花了一天一夜试图解决这个问题.
>浏览了有关该主题的众多页面.
>尝试了我自己的不同代码.
它仍然会发生.我是Android的初学者.
拜托,请帮助我.有没有办法解决我的问题?甚至认为其他应用程序设法做到了.
这是我的LogCat.
Process: com.kkze.Mappy, PID: 6742
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kkze.Mappy/com.kkze.Mappy.PlacesDecoder}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at com.kkze.Mappy.PlacesDecoder.getLocation(PlacesDecoder.java:62)
at com.kkze.Mappy.PlacesDecoder.onCreate(PlacesDecoder.java:32)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
同时检查位置!= null需要ACCESS_FINE_LOCATION权限,这会弄乱我的应用程序,导致它始终返回null.
解决方法:
正如Jon Skeet在评论中提到的,getLastKnownLocation()方法可以并且将返回null.主要问题是它不会向操作系统提示请求新的位置锁定,而只是检查是否有来自其他应用程序位置请求的最后一个已知位置.如果最近没有其他应用程序发出了位置请求,那么您将获得一个返回给您的空位置.
保证您实际获得位置的唯一方法是请求一个,这是通过调用requestLocationUpdates()来完成的.
传递给onLocationChanged()回调方法的位置不为null,因为回调仅发生在成功的位置锁定上.
请注意,您的应用程序注册位置更新的整个时间,都会导致额外的电池耗尽,因此请务必尽快取消注册位置更新.这里看起来你可以在第一个位置进入时取消注册.
此外,您可能需要考虑在等待位置锁定时在此Activity中显示进度对话框,以便向用户提供应用程序正在等待的某些反馈.
以下是代码应如下所示的一般结构:
public class MainActivity extends Activity
implements LocationListener {
Intent intentThatCalled;
public double latitude;
public double longitude;
public LocationManager locationManager;
public Criteria criteria;
public String bestProvider;
String voice2text; //added
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentThatCalled = getIntent();
voice2text = intentThatCalled.getStringExtra("v2txt");
getLocation();
}
public static boolean isLocationEnabled(Context context)
{
//...............
return true;
}
protected void getLocation() {
if (isLocationEnabled(MainActivity.this)) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
criteria = new Criteria();
bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString();
//You can still do this if you like, you might get lucky:
Location location = locationManager.getLastKnownLocation(bestProvider);
if (location != null) {
Log.e("TAG", "GPS is on");
latitude = location.getLatitude();
longitude = location.getLongitude();
Toast.makeText(MainActivity.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
searchNearestPlace(voice2text);
}
else{
//This is what you need:
locationManager.requestLocationUpdates(bestProvider, 1000, 0, this);
}
}
else
{
//prompt user to enable location....
//.................
}
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
//Hey, a non null location! Sweet!
//remove location callback:
locationManager.removeUpdates(this);
//open the map:
latitude = location.getLatitude();
longitude = location.getLongitude();
Toast.makeText(MainActivity.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
searchNearestPlace(voice2text);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
public void searchNearestPlace(String v2txt) {
//.....
}
}
内容总结
以上是互联网集市为您收集整理的java – 在空对象引用上调用虚方法’double android.location.Location.getLatitude()’时出错全部内容,希望文章能够帮你解决java – 在空对象引用上调用虚方法’double android.location.Location.getLatitude()’时出错所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。