5899


先日 `GoogleAPIClient` を使用して Google Map
に現在地を表示したいという、同じような質問がされていたようなのですが、私の場合初めの

[code]

    public class MainActivity extends FragmentActivity 
        implements
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            LocationListener {
    
[/code]

の `MainActivity`
の部分にエラーがでてつまづいています。いくつか説明されているところでも、このように記述されているのになぜエラーになってしまうのかわかりません。

どのような対処をすればよいでしょうか？教えていただければと思います。

seesaawiki.jp/w/moonlight_aska
の[現在地を表示する](http://seesaawiki.jp/w/moonlight_aska/d/%b8%bd%ba%df%c3%cf%a4%f2%c9%bd%bc%a8%a4%b9%a4%eb)を参考に  
`import com.google.android.gms.location.LocationClient;` の部分を  
`import com.google.android.gms.common.api.GoogleApiClient;` に変えています。

* * *

**追記** :  
今書いているMainActivity.javaですが文中にエラーが表示されていないのに、デバッグでマップが表示されません。改善方法を教えていただきたいです。

[code]

    package com.sample.testmap;
    
    
    import android.content.Intent;
    import android.view.View;
    
    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
    import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
    import com.google.android.gms.common.api.GoogleApiClient;
    //import com.google.android.gms.location.LocationClient;
    import com.google.android.gms.location.FusedLocationProviderApi;
    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.SupportMapFragment;
    import com.google.android.gms.maps.model.CameraPosition;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.MarkerOptions;
    
    import android.location.Location;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    
    public class MainActivity extends FragmentActivity
        implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {
    
        private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
        private LatLng mKansai = new LatLng(34.435912, 135.243496);
        private LatLng mItami = new LatLng(34.785500, 135.438004);
        private GoogleMap mMap = null;
    
        private GoogleApiClient mLocationClient = null;
        private static final LocationRequest REQUEST = LocationRequest.create()
            .setInterval(5000)
            .setFastestInterval(16)
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mMap = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            if(mMap != null) {
                mMap.setMyLocationEnabled(true);
            }
            mLocationClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
            if(mLocationClient != null){
                mLocationClient.connect();
            }
        }
    
        @Override
        public void onLocationChanged(Location location){
                CameraPosition cameraPos = new CameraPosition.Builder()
                    .target(new LatLng(location.getLatitude(),location.getLongitude())).zoom(17.0f)
                    .bearing(0).build();
                mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));
    
                //マーカー設定
                MarkerOptions options = new MarkerOptions();
                Intent intent = getIntent();
                String selectedA = intent.getStringExtra("SELECTED_ITEM");
                if(selectedA.equals("関西国際空港")){
                options.position(mKansai);
                mMap.addMarker(options);
                }
                else{
                options.position(mItami);
                mMap.addMarker(options);
                }
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult result){
    
        }
    
        @Override
        public void onConnected(Bundle connectionHint){
            fusedLocationProviderApi.requestLocationUpdates(mLocationClient, REQUEST, this);
        }
    
        @Override
        public void onConnectionSuspended(int cause){
    
        }
    
    
    }
    
[/code]

まず、

[code]

    import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
    import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
    
[/code]

に警告としてそれぞれ

[code]

    The import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks is never used
    The import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener is never used
    
[/code]

が表示されていました。  
これをデバッグするとLogCatに  
![log1](https://i.stack.imgur.com/ceaWL.png)  
![log2](https://i.stack.imgur.com/WIBsk.png)  
![log3](https://i.stack.imgur.com/Bl0WA.png)  
![log4](https://i.stack.imgur.com/5K4V3.png)  
が表示されました。  
また、  
![AT1](https://i.stack.imgur.com/jzo2J.png)  
が強制的に表示されました。

3009331さん毎回のアドバイスありがとうございます。  
無事にマップを表示することはできました。  
3009331さんが確認された動作でもマーカーを立てる部分と現在地の表示の部分はエラーが出ていないだけで、動作はしないものだったのでしょうか？


CC BY-SA 3.0
2015-02-03T15:54:51.807
5887
2015-02-06T05:06:18.710
2015-02-06T05:06:18.710
8066
8066
question
android google-maps 地理情報
Google Map で現在地を表示する ( GoogleAPIClient )


## 直し方:

  1. MainActivityの画面を選択してctrlキーとshiftキーとo(オー)キーを同時に押して  
インポートの編成を行う

  2. `mLocationClient = new GoogleApiClient.Builder(this)`と`.addConnectionCallbacks(this)`の間に一行、以下の通り入力する

.addApi(LocationServices.API)

手っ取り早く直したい場合は、動いたソースコードを全て下に置くので勝手にコピペしてください。

## 蛇足:

以下、上から目線の蛇足説明です。日本語に不自由しているのでご了承ください。

AndroidのLogcatの警告は大きく分けると2種類あります。  
1.直さないとアプリが起動できない警告  
2.直さなくてもアプリは起動できるけど、動作が重くなったりファイル容量が増えるので直した方が良い警告  
それ以外は全て雑音です。  
このことを念頭においてください。

今回ご質問にありました、`The import ~~ is never used`系の警告は2の警告ですが  
とりあえず、放置しましょう。  
それよりも1の直さないといつまでもアプリが起動できない警告を直す必要があります。

`Logcat`シートの右上に`Verbose`と書かれている欄があります。  
`Error`にしてみてください。多分画面が真っ赤に染まります。  
見た目にもいかにもエラーっぽい、これが直さないといけない警告ですね。

一番上のログ、最後の方を読むと理由が分かります。  
`java.lang.RuntimeException: Unable to start activity ComponentInfo{XXX}:
java.lang.IllegalArgumentException: must call addApi() to add at least one
API`  
APIを最低一つは追加して`addAPI()`を読んでください。

`GoogleApiClient`は地図のAPIではなく、色んなAPIを集めたものです。  
したがって、今から使用するのはそのうちどの機能なのか指定しなくてはいけません。  
<https://akira-watson.com/android/fusedlocationproviderapi>.htmlで  
`addApi`を検索すると50行目で`.addApi(LocationServices.API)`と  
していることが分かります。

ログに`foo()`などメソッド名が書いてある場合、  
とりあえず、自分のソースコードかwebでググる習慣を身につけると  
問題解決の切り分けが簡単にできるかと存じます。

AndroidManifest.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sample.testmap">
    
        <!-- 適当 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="xxxxx.permission.MAPS_RECEIVE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />
            <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="AIzaSyBQ4RhEMwQneZhlFKvobMIBBVcoMGYQXdU" />
        </application>
    
    </manifest>
    
[/code]

activity_main.xml

[code]

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingPrefix"
        tools:context=".MainActivity">
        <!-- mapの名前空間のつけ方に何故か失敗している -->
        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/map"
            xmlns:map="http://scheams.android.com/apk/res-auto"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            map:cameraTargetLat="35.41"
            map:cameraTargetLng="139.41" />
    
    </RelativeLayout>
    
[/code]

MainActivity.java

[code]

    package com.sample.testmap;
    
    import android.content.Intent;
    import android.location.Location;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    
    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.api.GoogleApiClient;
    import com.google.android.gms.location.FusedLocationProviderApi;
    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.SupportMapFragment;
    import com.google.android.gms.maps.model.CameraPosition;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.MarkerOptions;
    
    //import com.google.android.gms.location.LocationClient;
    
    public class MainActivity extends FragmentActivity
            implements
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            LocationListener {
    
        private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
        private LatLng mKansai = new LatLng(34.435912, 135.243496);
        private LatLng mItami = new LatLng(34.785500, 135.438004);
        private GoogleMap mMap = null;
    
        private GoogleApiClient mLocationClient = null;
        private static final LocationRequest REQUEST = LocationRequest.create()
                .setInterval(5000)
                .setFastestInterval(16)
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mMap = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            if(mMap != null) {
                mMap.setMyLocationEnabled(true);
            }
            mLocationClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            if(mLocationClient != null){
                mLocationClient.connect();
            }
        }
    
        @Override
        public void onLocationChanged(Location location){
            CameraPosition cameraPos = new CameraPosition.Builder()
                    .target(new LatLng(location.getLatitude(),location.getLongitude())).zoom(17.0f)
                    .bearing(0).build();
            mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));
    
            //マーカー設定
            MarkerOptions options = new MarkerOptions();
            Intent intent = getIntent();
            String selectedA = intent.getStringExtra("SELECTED_ITEM");
            if(selectedA !=null && selectedA.equals("関西国際空港")){
                options.position(mKansai);
                mMap.addMarker(options);
            }else if(selectedA !=null && selectedA.equals("伊丹空港")){
                options.position(mItami);
                mMap.addMarker(options);
            }
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult result){
    
        }
    
        @Override
        public void onConnected(Bundle connectionHint){
            fusedLocationProviderApi.requestLocationUpdates(mLocationClient, REQUEST, this);
        }
    
        @Override
        public void onConnectionSuspended(int cause){
    
        }
    
    
    }
    
[/code]


CC BY-SA 3.0
2015-02-03T23:11:18.690
5899
2015-02-06T02:50:40.947
2015-02-06T02:50:40.947
2904
2904
5887
answer