2016-07-12 9 views
2

私は現在の場所を取得するためにfusedLocationApiを使用しようとしています。onLocationChangedはfusedLocationAPI.requestLocationUpdatesを使用して呼び出されません

FusedLocationApi.requestLocationUpdates

とコールバックがに行く:

onLocationChanged(場所を私たちは使用して位置情報の更新を要求することができhttps://developer.android.com/training/location/receive-location-updates.html?hl=es オンラインドキュメントによると、エミュレートネクサス6とAndroidのスタジオを使用していますlocation)

ただし、onLocationChangedはまったく呼び出されません。もしそうであれば、Log.d行をそこに置くと、何かがログに出力されます。 startLocationUpdates()が呼び出されることに注意してください。以下は私のコードです。誰かがこれについていくつかの光を当てることができれば素晴らしいだろう=)私はAndroidには本当に新しいので、私はちょっと無礼なんだよ。この問題を引き起こしているエミュレータ(GPS、.. idk)について何かがありますか?

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

private GoogleMap mMap; // google map works well just as default project 
private GoogleApiClient mGoogleApiClient; 
public static final String TAG = MapsActivity.class.getSimpleName(); 
private LocationRequest mLocationRequest; 
private static final int REQUEST_LOCATION = 2; 
private Location location; 

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

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

    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(1000) 
      .setFastestInterval(100); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
      && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
       REQUEST_LOCATION); 
    } else { 
     location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (location == null) { 
      startLocationUpdates(); 
     } 
     else { 
      handleNewLocation(location); 
     }; 
    } 
} 

protected void startLocationUpdates() { 
    Log.d(TAG, "Requesting location updates"); 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
}  

@Override 
public void onLocationChanged(Location location) { 
    String msg = "Updated Location: " + 
      Double.toString(location.getLatitude()) + "," + 
      Double.toString(location.getLongitude()); 
    Log.d(TAG, msg); 
} 

のmanifest.xml

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

Gradleのビルド:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:24.0.0' 
    compile 'com.google.android.gms:play-services:9.0.0' 
} 

答えて

2

あなたはあなたのGPSがオンになっていますか? GitHubのGoogle Googleでこのサンプルプロジェクトを試してみることができます。このプロジェクトでは、ロケーションサービスが有効になっているかどうかを確認するためのコードも提供しています。そうでない場合は、ユーザに位置情報サービスを有効にするためのメッセージが表示されます。

/* 
* Copyright (C) 2012 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.mapdemo; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.Toast; 

/** 
* This demo shows how GMS Location can be used to check for changes to the users location. The 
* "My Location" button uses GMS Location to set the blue dot representing the users location. 
* Permission for {@link android.Manifest.permission#ACCESS_FINE_LOCATION} is requested at run 
* time. If the permission has not been granted, the Activity is finished with an error message. 
*/ 
public class MyLocationDemoActivity extends AppCompatActivity 
     implements 
     OnMyLocationButtonClickListener, 
     OnMapReadyCallback, 
     ActivityCompat.OnRequestPermissionsResultCallback { 

    /** 
    * Request code for location permission request. 
    * 
    * @see #onRequestPermissionsResult(int, String[], int[]) 
    */ 
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1; 

    /** 
    * Flag indicating whether a requested permission has been denied after returning in 
    * {@link #onRequestPermissionsResult(int, String[], int[])}. 
    */ 
    private boolean mPermissionDenied = false; 

    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_location_demo); 

     SupportMapFragment mapFragment = 
       (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

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

     mMap.setOnMyLocationButtonClickListener(this); 
     enableMyLocation(); 
    } 

    /** 
    * Enables the My Location layer if the fine location permission has been granted. 
    */ 
    private void enableMyLocation() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      // Permission to access the location is missing. 
      PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE, 
        Manifest.permission.ACCESS_FINE_LOCATION, true); 
     } else if (mMap != null) { 
      // Access to the location has been granted to the app. 
      mMap.setMyLocationEnabled(true); 
     } 
    } 

    @Override 
    public boolean onMyLocationButtonClick() { 
     Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show(); 
     // Return false so that we don't consume the event and the default behavior still occurs 
     // (the camera animates to the user's current position). 
     return false; 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
      @NonNull int[] grantResults) { 
     if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) { 
      return; 
     } 

     if (PermissionUtils.isPermissionGranted(permissions, grantResults, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 
      // Enable the my location layer if the permission has been granted. 
      enableMyLocation(); 
     } else { 
      // Display the missing permission error dialog when the fragments resume. 
      mPermissionDenied = true; 
     } 
    } 

    @Override 
    protected void onResumeFragments() { 
     super.onResumeFragments(); 
     if (mPermissionDenied) { 
      // Permission was not granted, display error dialog. 
      showMissingPermissionError(); 
      mPermissionDenied = false; 
     } 
    } 

    /** 
    * Displays a dialog with error message explaining that the location permission is missing. 
    */ 
    private void showMissingPermissionError() { 
     PermissionUtils.PermissionDeniedDialog 
       .newInstance(true).show(getSupportFragmentManager(), "dialog"); 
    } 

} 
0

古い質問ですが、最後に試してから何か変わっていない限り、エミュレータはその場所を知りません。座標を送る必要があります。

関連する問題