2016-10-20 19 views
3

私は自分でAndroidを学習しようとしています。そして、私のアプリでは、私はGoogleの地図を表示するフラグメントを使用すると、ユーザーが自分のアプリケーションを開いたとき、私はGoogleApiClient マイフラグメントのコードを使用して、現在位置を取得したい:ここGoogleApiClient in Fragment Android

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(); 
     } 
    } 

} 

と問題: -Log中をonCreateViewメソッドはonconnectメソッドのログイン前に表示されるため、googleAPIClientがまだ接続されていないため、getLastLocation()を取得できません。

Googleで検索していますが、修正方法はわかりません。 私を助けてください! 私の最高の英語を残念に思います。

+0

フラグメントのonCreate()メソッドでGoogleAPIClientを接続しようとします。 –

+0

'mMapView.getMapAsync'をonConnectedに移動すると、それが機能しました。とにかく、ありがとう。 –

答えて

1

まず問題の方法でログがをonconnected前GoogleApiClientは、それが処理に時間がかかりすぎるなど、証明書のフィンガープリントを確認し、アプリの設定を確認し、Googleの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)); 

オーバーライドされたメソッドonConnected()のボディに。 非常に問題があるため、onCreateView()に直接このコードを記述することはできません。ロケーション要求が送信される前に、まず接続を確立する必要があります。接続は迅速に確立するか、通常よりも長くかかります。それはあなたのコントロールの外にある多くのものに依存します。

この理由から、onConnected()が呼び出されたときに、ロケーションサービスが接続していることを示すプログレスバーを表示し、プログレスバーを削除することをお勧めします。もちろん、これはあなたのアプリに完全に依存します。ユーザーにロケーションサービスが不可欠である場合、これは必須です。そうでなければ、追加する必要はありません。

関連する問題