Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试调用虚拟方法错误(NullPointerException)_Java_Android - Fatal编程技术网

Java 尝试调用虚拟方法错误(NullPointerException)

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

当我试图运行应用程序时,它崩溃了,我出现以下错误:

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)'

以下是应用程序的代码:

    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