2016-10-20 9 views
3

나 혼자서 안드로이드를 배우려고합니다. 그리고 내 애플 리케이션에, 나는 구글 맵을 보여주기 위해 조각을 사용하려는 사용자가 내 응용 프로그램을 열 때, 나는 GoogleApiClient 내 조각 코드를 사용하여 현재 위치를 얻으려면 : 여기안드로이드에있는 GoogleApiClient

public class HomeFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

    public interface comuticateParent { 
     public void sendMess(String text); 
    } 

    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 


    public HomeFragment() { 
     // Required empty public constructor 
    } 

    public static HomeFragment newInstance(String param1, String param2) { 
     HomeFragment fragment = new HomeFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    comuticateParent callback; 
    Button btn1; 
    TextView textView; 
    MapView mMapView; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    LocationRequest mLocationRequest; 
    private GoogleMap googleMap; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
     mMapView = (MapView) rootView.findViewById(R.id.mapView); 
     mMapView.onCreate(savedInstanceState); 

     mMapView.onResume(); // needed to get the map to display immediately 

     try { 
      MapsInitializer.initialize(getActivity().getApplicationContext()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     mMapView.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap mMap) { 
       googleMap = mMap; 
       googleMap.setMyLocationEnabled(true); 

       mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       Log.d("onCreateView", Boolean.toString(mGoogleApiClient.isConnected())); 
       googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mylocation, 13)); 
      } 
     }); 
     return rootView; 
    } 

    @Override 
    public void onStart() { 
     mGoogleApiClient.connect(); 
     Log.d("ConnectonStart", "Connected "); 
     Log.d("ONstart", Boolean.toString(mGoogleApiClient.isConnected())); 
     super.onStart(); 
    } 

    @Override 
    public void onStop() { 
     mGoogleApiClient.disconnect(); 
     super.onStop(); 
    } 

    @Override 
    public void onResume() { 
     mGoogleApiClient.connect(); 
     super.onResume(); 
     mMapView.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mMapView.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mMapView.onDestroy(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mMapView.onLowMemory(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Log.d("Connect", "Connected "); 
     Log.d("onConnected", Boolean.toString(mGoogleApiClient.isConnected())); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.d("Connect", "failed "); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     Activity activity; 
     if (context instanceof Activity) { 
      activity = (Activity) context; 
      callback = (comuticateParent) getActivity(); 
     } 
    } 

} 

그리고 문제 : - 로그의를 onCreateView 메서드는 onconnected 메서드에서 로그인하기 전에 표시되므로 googleAPIClient가 아직 연결되어 있지 않아 getLastLocation()을 얻을 수 없습니다.

Google에서 검색하고 있지만 수정 방법을 모르겠습니다. 도와주세요! 영어로하는 것에 대해 유감스럽게 생각합니다.

+0

조각의 onCreate() 메소드에서 GoogleAPIClient를 연결해 봅니다. –

+0

'mMapView.getMapAsync'를 onConnected로 이동하면 성공했습니다. 어쨌든, 고마워. –

답변

1

첫 번째 문제 방법 로그을 onconnected 전에 GoogleApiClient 그것은 처리하는 데 시간이 너무 오래 걸릴 등, 인증서 지문을 확인, 응용 프로그램 구성을 확인, 구글 API를 액세스하기 때문에 나타납니다 onCreateView 방법 로그인합니다. UI 스레드를 차단하지 않기 위해 다른 스레드에서 실행하고 비동기 콜백을 사용합니다.

두 번째 문제 당신이 배경 GoogleMap을 얻을 필요가 있으므로 FusedLocationApi 만, 배경을 유지하기 때문에 googleAPIClient는 아직 연결되지 않기 때문에 내가 getLastLocation()을 얻을 수 없습니다. 당신이 위치 업데이트를 요청하기 전에 https://gist.github.com/quydm/a458d908c4da2496672f83372304f417

0

당신은 GoogleApiClient가 연결 될 때까지 기다려야 할 것이다 :

여기 내 샘플을 참조하십시오. 그래서, 당신은이 코드 블록을 이동 것 그러기 위해서는 (현재 onCreateView() 방법에 있음) :

mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
Log.d("onCreateView", Boolean.toString(mGoogleApiClient.isConnected())); 
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mylocation, 13)); 

를 오버라이드 (override) 된 메소드 onConnected()의 몸에. 매우 문제가있어서 onCreateView()에 직접이 코드를 사용할 수 없습니다. 위치 요청을 보내기 전에 먼저 연결을 설정해야합니다. 연결은 빠르게 설정되거나 정상보다 오래 걸릴 수 있습니다. 그것은 당신이 통제 할 수없는 많은 것들에 달려 있습니다.

이러한 이유 때문에 위치 서비스가 연결되었음을 나타내는 일종의 진행 표시 줄을 제시하고 onConnected()이 호출되면 진행률 표시 줄을 제거하는 것이 좋습니다. 물론 이것은 전적으로 앱에 달려 있습니다. 위치 서비스가 사용자에게 필수적이라면 필수 항목이며, 그렇지 않으면 추가하지 않아도됩니다.

관련 문제