Java 尝试调用虚拟方法错误(NullPointerException)
当我试图运行应用程序时,它崩溃了,我出现以下错误: java.lang.RuntimeException:无法在空对象引用上启动活动组件信息{com.example.myapplication/com.example.myapplication.MainActivityMaps}:java.lang.NullPointerException:尝试调用虚拟方法'void com.google.android.gms.maps.MapFragment.getMapAsync(com.google.android.gms.maps.OnMapredyCallback)' 以下是应用程序的代码:Java 尝试调用虚拟方法错误(NullPointerException),java,android,Java,Android,当我试图运行应用程序时,它崩溃了,我出现以下错误: java.lang.RuntimeException:无法在空对象引用上启动活动组件信息{com.example.myapplication/com.example.myapplication.MainActivityMaps}:java.lang.NullPointerException:尝试调用虚拟方法'void com.google.android.gms.maps.MapFragment.getMapAsync(com.google.a
package com.example.myapplication;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivityMaps extends FragmentActivity implements
OnMapReadyCallback {
GoogleMap map;
ArrayList<LatLng> markerPoints;
TextView tvDistanceDuration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDistanceDuration = (TextView) findViewById(R.id.tv_distance_time);
// Initializing
markerPoints = new ArrayList<LatLng>();
// Getting reference to SupportMapFragment of the activity_main
MapFragment fm = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
fm.getMapAsync(this);
// Getting Map for the SupportMapFragment
}
public void onMapReady(GoogleMap googleMap) {
// Enable MyLocation Button in the Map
// 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.
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
map.setMyLocationEnabled(true);
// Setting onclick event listener for the map
map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
// Already two locations
if (markerPoints.size() > 1) {
markerPoints.clear();
map.clear();
}
// Adding new item to the ArrayList
markerPoints.add(point);
// Creating MarkerOptions
MarkerOptions options = new MarkerOptions();
// Setting the position of the marker
options.position(point);
/**
* For the start location, the color of marker is GREEN and
* for the end location, the color of marker is RED.
*/
if (markerPoints.size() == 1) {
options.icon(BitmapDescriptorFactory.defaultMarker
(BitmapDescriptorFactory.HUE_GREEN));
} else if (markerPoints.size() == 2) {
package com.example.myapplication;
导入android.Manifest;
导入android.content.pm.PackageManager;
导入android.graphics.Color;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.FragmentActivity;
导入android.util.Log;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.MapFragment;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.model.BitmapDescriptorFactory;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.MarkerOptions;
导入com.google.android.gms.maps.model.PolylineOptions;
导入org.json.JSONObject;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
公共类MainActivityMaps扩展了FragmentActivity实现
onmapredycallback{
谷歌地图;
ArrayList markerPoints;
文本视图tvdestanceduration;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvdanceduration=(TextView)findViewById(R.id.tv\u distance\u time);
//初始化
markerPoints=newarraylist();
//获取对活动\u main的SupportMapFragment的引用
MapFragment fm=(MapFragment)getFragmentManager().findFragmentById(R.id.map);
fm.getmapsync(this);
//正在获取SupportMapFragment的映射
}
4月1日公开作废(谷歌地图谷歌地图){
//在地图中启用MyLocation按钮
考虑到呼叫
//ActivityCompat#请求权限
//在此处请求缺少的权限,然后覆盖
//public void onRequestPermissionsResult(int-requestCode,字符串[])
权限,
//int[]格兰特结果)
//处理用户授予权限的情况。请参阅
文档
//对于ActivityCompat,请请求权限以获取更多详细信息。
如果(ActivityCompat.checkSelfPermission)(此,
清单.权限.访问(位置)!=
PackageManager.PERMISSION_已授予&&
ActivityCompat.checkSelfPermission(此,
清单.权限.访问(位置)!=
PackageManager.权限(已授予){
返回;
}
map.setMyLocationEnabled(true);
//为映射设置onclick事件侦听器
setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共空区(停车点){
//已经有两个地点了
if(markerPoints.size()>1){
markerPoints.clear();
map.clear();
}
//向ArrayList添加新项
标记点。添加(点);
//创建标记选项
MarkerOptions options=新的MarkerOptions();
//设置标记的位置
选项。位置(点);
/**
*对于起始位置,标记的颜色为绿色和白色
*对于结束位置,标记的颜色为红色。
*/
if(markerPoints.size()==1){
选项.图标(BitmapDescriptorFactory.defaultMarker
(BitmapDescriptorFactory.HUE_GREEN));
}else if(markerPoints.size()==2){
图标(BitmapDescriptorFactory.defaultMarker)(BitmapDescriptorFactory.HUE\R
(ED),;
}
// Add new marker to the Google Map Android API V2
map.addMarker(options);
// Checks, whether start and end locations are captured
if (markerPoints.size() >= 2) {
LatLng origin = markerPoints.get(0);
LatLng dest = markerPoints.get(1);
// Getting URL to the Google Directions API
String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);
}
}
});
}
private String getDirectionsUrl(LatLng origin, LatLng dest) {
// Origin of route
String str_origin = "origin=" + origin.latitude + "," + origin.longitude;
// Destination of route
String str_dest = "destination=" + dest.latitude + "," + dest.longitude;
// Sensor enabled
String sensor = "sensor=false";
// Building the parameters to the web service
String parameters = str_origin + "&" + str_dest + "&" + sensor;
// Output format
String output = "json";
// Building the url to the web service
String url = "https://maps.googleapis.com/maps/api/directions/" + output
+ "?" + parameters;
return url;
}
/**
* A method to download json data from url
*/
private String downloadUrl(String strUrl) throws IOException {
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try {
URL url = new URL(strUrl);
// Creating an http connection to communicate with url
urlConnection = (HttpURLConnection) url.openConnection();
// Connecting to url
urlConnection.connect();
// Reading data from url
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new
InputStreamReader(iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (Exception e) {
Log.d("Exceptiondownloadingurl", e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
return data;
}
// Fetches data from url passed
private class DownloadTask extends AsyncTask<String, Void, String>
{
// Downloading data in non-ui thread
@Override
protected String doInBackground(String... url) {
// For storing data from web service
String data = "";
try {
// Fetching the data from web service
data = downloadUrl(url[0]);
} catch (Exception e) {
Log.d("Background Task", e.toString());
}
return data;
}
// Executes in UI thread, after the execution of
// doInBackground()
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
ParserTask parserTask = new ParserTask();
// Invokes the thread for parsing the JSON data
parserTask.execute(result);
}
}
/**
* A class to parse the Google Places in JSON format
*/
private class ParserTask extends AsyncTask<String, Integer,
List<List<HashMap<String, String>>>> {
// Parsing the data in non-ui thread
@Override
protected List<List<HashMap<String, String>>> doInBackground(String...
jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try {
jObject = new JSONObject(jsonData[0]);
DirectionsJSONParser parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
// Executes in UI thread, after the parsing process
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result)
{
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
String distance = "";
String duration = "";
if (result.size() < 1) {
Toast.makeText(getBaseContext(), "No Points",
Toast.LENGTH_SHORT).show();
return;
}
// Traversing through all the routes
for (int i = 0; i < result.size(); i++) {
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for (int j = 0; j < path.size(); j++) {
HashMap<String, String> point = path.get(j);
if (j == 0) { // Get distance from the list
distance = (String) point.get("distance");
continue;
} else if (j == 1) { // Get duration from the list
duration = (String) point.get("duration");
continue;
}
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(2);
lineOptions.color(Color.RED);
}
tvDistanceDuration.setText("Distance:" + distance + ", Duration:" +
duration);
// Drawing polyline in the Google Map for the i-th route
map.addPolyline(lineOptions);
}
}}
//向Google Map Android API V2添加新标记
map.addMarker(选项);
//检查是否捕获开始和结束位置
如果(markerPoints.size()>=2){
LatLng origin=markerPoints.get(0);
LatLng dest=标记点获取(1);
//获取Google Directions API的URL
字符串url=getDirectionsUrl(源、目标);
DownloadTask DownloadTask=新的DownloadTask();
//开始从Google Directions API下载json数据
downloadTask.execute(url);
}
}
});
}
私有字符串getDirectionsUrl(LatLng来源,LatLng目的地){
//路线起点
字符串str_origin=“origin=“+origin.latitude+”,“+origin.longitude;
//路线目的地
字符串str_dest=“destination=“+dest.latitude+”,“+dest.longitude;
//传感器启用
字符串sensor=“sensor=false”;
//为web服务构建参数
字符串参数=str_origin+“&”+str_dest+“&”+传感器;
//输出格式
字符串输出=“json”;
//构建web服务的url
字符串url=”https://maps.googleapis.com/maps/api/directions/“+输出
+“?”+参数;
返回url;
}
/**
*从url下载json数据的方法
*/
私有字符串下载URL(字符串strUrl)引发IOException{
字符串数据=”;
InputStream iStream=null;
HttpURLConnection-urlConnection=null;
试一试{
URL=新URL(strUrl);
//创建http连接以与url通信
urlConnection=(HttpURLConnection)url.openConnection();
//连接到url
urlConnection.connect();
//从url读取数据
iStream=urlC
MapFragment fm = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
fm.getMapAsync(this);// fm is null