2017-05-02 7 views
0

パブリックボイドのonLocationChanged(ロケーションロケーション)を使用してGoogleマップ上のユーザーのパスをトレースするアプリケーションを作成しようとしていますが、クラッシュします。ここに私のコードです..あなたが修正する必要があるものがあれば教えてください。ありがとう!Google Apiクライアントとロケーションリスナーの実装中にアプリケーションがクラッシュする

Androidのマニフェストファイルここ

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="edu.carthage.haag.jacob.homework_application_android"> 

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> 
    <!-- 
      The API key for Google Maps-based APIs is defined as a string resource. 
      (See the file "res/values/google_maps_api.xml"). 
      Note that the API key is linked to the encryption key used to sign the APK. 
      You need a different API key for each encryption key, including the release key that is used to 
      sign the APK for publishing. 
      You can define the keys for the debug and release targets in src/debug/ and src/release/. 
     --> 


    <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyD-2jUwPWvPzHmsdIiYuW9tLarxYe6AQwE" /> 

    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name="edu.carthage.haag.jacob.homework_application_android.MapsActivity" 
     android:label="@string/title_activity_maps"> 

    </activity> 

</application> 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

</manifest> 

package edu.carthage.haag.jacob.homework_application_android; 
 

 
import android.Manifest; 
 
import android.content.Context; 
 
import android.content.pm.PackageManager; 
 
import android.graphics.Color; 
 
import android.location.Location; 
 
import android.location.LocationManager; 
 
import android.os.Build; 
 
import android.support.annotation.NonNull; 
 
import android.support.annotation.Nullable; 
 
import android.support.v4.app.ActivityCompat; 
 
import android.support.v4.app.FragmentActivity; 
 
import android.os.Bundle; 
 
import android.support.v4.content.ContextCompat; 
 
import android.widget.Toast; 
 

 
import com.google.android.gms.common.ConnectionResult; 
 
import com.google.android.gms.common.api.GoogleApiClient; 
 
import com.google.android.gms.common.api.PendingResult; 
 
import com.google.android.gms.common.api.Status; 
 
import com.google.android.gms.location.LocationListener; 
 
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.BitmapDescriptorFactory; 
 
import com.google.android.gms.maps.model.LatLng; 
 
import com.google.android.gms.maps.model.MarkerOptions; 
 
import com.google.android.gms.maps.model.Polyline; 
 
import com.google.android.gms.maps.model.PolylineOptions; 
 

 
import java.text.DateFormat; 
 
import java.util.ArrayList; 
 
import java.util.Date; 
 

 
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, 
 
     GoogleApiClient.OnConnectionFailedListener, LocationListener { 
 

 
    private GoogleMap mMap; 
 
    private final static int MY_PERMISSION_FINE_LOCATION = 101; 
 
    GoogleApiClient mGoogleApiClient; 
 
    private ArrayList<LatLng> points; //added 
 
    Polyline line; //added 
 
    private Context context; 
 
    private static final long INTERVAL = 5000; //1 minute 
 
    private static final long FASTEST_INTERVAL = 1000; // 1 minute 
 
    private static final float SMALLEST_DISPLACEMENT = 0.05F; //quarter of a meter 
 
    private LocationRequest mLocationRequest; 
 

 
    private LocationManager mLocationManager; 
 
    private float LOCATION_REFRESH_DISTANCE = 1; 
 
    private long LOCATION_REFRESH_TIME = 100; 
 
    //gets the initial gps coordinates 
 
    private Location mLastLocation; 
 

 
    String locationProvider; 
 

 
    protected void createLocationRequest() { 
 

 
//  LocationServices.FusedLocationApi.requestLocationUpdates(
 
//    mGoogleApiClient, mLocationRequest, this); 
 
// 
 
//  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
 
//   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
 
//  } 
 
    } 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_maps); 
 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
 
       .findFragmentById(R.id.map); 
 

 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
 
       .addApi(LocationServices.API) 
 
       .addConnectionCallbacks(this) 
 
       .addOnConnectionFailedListener(this) 
 
       .build(); 
 

 
     mapFragment.getMapAsync(this); 
 
     points = new ArrayList<LatLng>(); //added 
 
     context = MapsActivity.this; 
 

 
     //createLocationRequest(); 
 
    } 
 

 
    @Override 
 
    protected void onStart() { 
 

 
     super.onStart(); 
 
     if (mGoogleApiClient != null) { 
 
      mGoogleApiClient.connect(); 
 
     } 
 

 
     mLocationRequest = new LocationRequest(); 
 
     mLocationRequest.setInterval(INTERVAL); 
 
     mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
 
     mLocationRequest.setSmallestDisplacement(SMALLEST_DISPLACEMENT); //added 
 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
 

 
     if (ContextCompat.checkSelfPermission(this, 
 
       Manifest.permission.ACCESS_FINE_LOCATION) 
 
       == PackageManager.PERMISSION_GRANTED) { 
 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
 
     } 
 
    } 
 

 
    @Override 
 
    public void onMapReady(GoogleMap googleMap) { 
 
     mMap = googleMap; 
 

 
     // Add a marker in Sydney and move the camer 
 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
 
      mMap.setMyLocationEnabled(true); 
 
     } else { 
 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION); 
 
      } 
 
     } 
 

 

 
    } 
 

 

 
    @Override 
 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
 
     switch (requestCode) { 
 
      case MY_PERMISSION_FINE_LOCATION: 
 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
 
         mMap.setMyLocationEnabled(true); 
 
        } 
 

 
       } else { 
 
        Toast.makeText(getApplicationContext(), "This app requires location permissions to be granted", Toast.LENGTH_LONG).show(); 
 
        finish(); 
 
       } 
 
       break; 
 
     } 
 
    } 
 

 
    @Override 
 
    public void onLocationChanged(Location location) { 
 
     double latitude = location.getLatitude(); 
 
     double longitude = location.getLongitude(); 
 
     LatLng latLng = new LatLng(latitude, longitude); //you already have this 
 

 
     MarkerOptions markerOptions = new MarkerOptions(); 
 
     markerOptions.position(latLng); 
 
     markerOptions.title("New Position"); 
 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
 
     //move map camera 
 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 
 

 
     points.add(latLng); //added 
 

 
     redrawLine(); //added 
 
    } 
 

 
    private void redrawLine() { 
 

 
     mMap.clear(); //clears all Markers and Polylines 
 

 
     PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); 
 
     for (int i = 0; i < points.size(); i++) { 
 
      LatLng point = points.get(i); 
 
      options.add(point); 
 
     } 
 
     //addMarker(); //add Marker in current position 
 
     line = mMap.addPolyline(options); //add Polyline 
 
    } 
 

 
    @Override 
 
    public void onConnected(@Nullable Bundle bundle) { 
 

 
    } 
 

 
    @Override 
 
    public void onConnectionSuspended(int i) { 
 

 
    } 
 

 
    @Override 
 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
 

 
    } 
 

 
    // @Override 
 
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
 
//  super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
 
//  switch (requestCode) { 
 
//   case MY_PERMISSION_FINE_LOCATION: 
 
//    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
 
//     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
 
//      mMap.setMyLocationEnabled(true); 
 
//     } 
 
// 
 
//    } else { 
 
//     Toast.makeText(getApplicationContext(), "This app requires location permissions to be granted", Toast.LENGTH_LONG).show(); 
 
//     finish(); 
 
//    } 
 
//    break; 
 
//  } 
 
// } 
 

 
}
スタックトレースあたりとして

+0

どこがクラッシュするか - かなり重要な情報だと思います。 –

+0

これはjavascriptとしてタグ付けされていますか? –

+0

ポストあなたのスタックトレースあなたはこのクラッシュを得ている。.. –

答えて

0

、あなたがGoogleAPI前に場所にアクセスしようとしているようで、私のMapsActivity.javaファイルですクライアントが接続されています。

したがって、接続時に場所を要求する必要があります。同じことが実装できます。

if(mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 

それとも方法をonConnected位置情報の更新を要求することができます。

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
} 

あなたは、私がテストした完全なコードを見つけ、私が言ったことを行っていない: 行番号103行番号を参照してください179

package edu.carthage.haag.jacob.homework_application_android; 
import android.Manifest; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.graphics.Color; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.content.ContextCompat; 
import android.widget.Toast; 

import com.devop.aashish.androiddemo.R; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
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.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.Polyline; 
import com.google.android.gms.maps.model.PolylineOptions; 

import java.util.ArrayList; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, LocationListener, GoogleApiClient.OnConnectionFailedListener { 

    private final static int MY_PERMISSION_FINE_LOCATION = 101; 
    private static final long INTERVAL = 5000; //1 minute 
    private static final long FASTEST_INTERVAL = 1000; // 1 minute 
    private static final float SMALLEST_DISPLACEMENT = 0.05F; //quarter of a meter 
    GoogleApiClient mGoogleApiClient; 
    Polyline line; //added 
    String locationProvider; 
    private GoogleMap mMap; 
    private ArrayList<LatLng> points; //added 
    private Context context; 
    private LocationRequest mLocationRequest; 
    private LocationManager mLocationManager; 
    private float LOCATION_REFRESH_DISTANCE = 1; 
    private long LOCATION_REFRESH_TIME = 100; 
    //gets the initial gps coordinates 
    private Location mLastLocation; 

    protected void createLocationRequest() { 

//  LocationServices.FusedLocationApi.requestLocationUpdates(
//    mGoogleApiClient, mLocationRequest, this); 
// 
//  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
//   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
//  } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     mapFragment.getMapAsync(this); 
     points = new ArrayList<LatLng>(); //added 
     context = MapsActivity.this; 

     //createLocationRequest(); 
    } 

    @Override 
    protected void onStart() { 

     super.onStart(); 
     if (mGoogleApiClient != null) { 
      mGoogleApiClient.connect(); 
     } 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(INTERVAL); 
     mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
     mLocationRequest.setSmallestDisplacement(SMALLEST_DISPLACEMENT); //added 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
//   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      if (mGoogleApiClient.isConnected()) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } else { 
       Toast.makeText(context, "Google API not connected yet", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Sydney and move the camera 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      mMap.setMyLocationEnabled(true); 
     } else { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION); 
      } 
     } 


    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case MY_PERMISSION_FINE_LOCATION: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
         mMap.setMyLocationEnabled(true); 
        } 

       } else { 
        Toast.makeText(getApplicationContext(), "This app requires location permissions to be granted", Toast.LENGTH_LONG).show(); 
        finish(); 
       } 
       break; 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 
     LatLng latLng = new LatLng(latitude, longitude); //you already have this 

     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("New Position"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
     //move map camera 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

     points.add(latLng); //added 

     redrawLine(); //added 
    } 

    private void redrawLine() { 

     mMap.clear(); //clears all Markers and Polylines 

     PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); 
     for (int i = 0; i < points.size(); i++) { 
      LatLng point = points.get(i); 
      options.add(point); 
     } 
     //addMarker(); //add Marker in current position 
     line = mMap.addPolyline(options); //add Polyline 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      if (mGoogleApiClient.isConnected()) { 
       Toast.makeText(context, "Google API connected", Toast.LENGTH_SHORT).show(); 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } else { 
       Toast.makeText(context, "Google API not connected yet", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    // @Override 
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
//  super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
//  switch (requestCode) { 
//   case MY_PERMISSION_FINE_LOCATION: 
//    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
//     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
//      mMap.setMyLocationEnabled(true); 
//     } 
// 
//    } else { 
//     Toast.makeText(getApplicationContext(), "This app requires location permissions to be granted", Toast.LENGTH_LONG).show(); 
//     finish(); 
//    } 
//    break; 
//  } 
// } 
} 
+0

私はmGoogleApiClient.connect()を追加しました。私のonStart()メソッドに渡して、LocationServices.FusedLocationApiを呼び出しようとしました。requestLocationUpdates(mGoogleApiClient、mLocationRequest、this);アプリが再びクラッシュした。上記のコードを新しいスタックトレースとMapsActivity.javaファイルで更新しました。どう考えているか教えてください! –

+0

onConnectedメソッドでFusedLocation.requestLocationUpdatesをリクエストしましたか?あなたのアプリがまだクラッシュした場合、完全なクラッシュログをコメントとして入力してください。 –

+0

はい、私はonConnectedメソッドでFusedLocation.requestLocationUpdatesを要求します。私のクラッシュログは以下のコメントにあります –

0

はこれを試してみてください。この方法を使用してoncreate()で googleApiクライアントonstart()ではなくoncreate()

@Override 
    protected void onStart() { 
     super.onStart(); 
     if (mGoogleApiClient != null) { 
      mGoogleApiClient.connect(); 
     } 
    } 

そしてInitilizeで接続し、GoogleのAPIクライアントにと(のonCreateで呼び出す)

 mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API).build(); 

はそれが

+0

mGoogleApiClient.connect()を追加しました。私のonStart()メソッドに渡してから、LocationServices.FusedLocationApi.requestLocationUpdates(mGo ogleApiClient、mLocationRequest、this)を呼び出しようとしました。アプリが再びクラッシュした。上記のコードを新しいスタックトレースとMapsActivity.javaファイルで更新しました。あなたが考えていることを教えてください –

+0

ログインを追加してください –

0

はありがとう役に立てば幸いすべての助けのために、私は私の問題を把握することができました。問題は、oCationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient、mLocationRequest、this)というonConnected()メソッドを使用していないことでした。が呼び出されます。今私はすべての変更を行った!

関連する問題