20761


お世話になっております。  
  
質問：GoogleApiClient.Builderをstaticで使用する方法を教えて下さい。

検索でよく見つかる方法で、下記のコードがあります。

[code]

    locationClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)        //利用するAPIの指定
                    .addConnectionCallbacks(this)        //接続完了リスナ
                    .addOnConnectionFailedListener(this) //接続失敗リスナ                      
                    .build();
    
[/code]

これを以下のstaticで使用する場合はどのようにすればよいのでしょうか？

[code]

    protected static void connectGooglePlayServices() {
    
        locationClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    
        if (REQUEST != null) {
            // GoogleApiClient start
            locationClient.connect();
        }
    }
    
[/code]

以下の方法でできないかを試みているのですが思わしくありません。  
変換出来ないのは理解できるのですが、どのようにすればの解答にたどり着けない状態です。  
実現したのはPush通知をトリガーとしてGeofenceの更新を行おうことです。  
周囲に相談できる人がおらず手探りで行っており、可能かどうかも自信がない状態です。  
アドバイスいただければ幸いです。

ApplicationController

[code]

    public class AApplicationController extends Application {
    private static ApplicationController sInstance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            sInstance = this;
        }
    
        public static synchronized ApplicationController getInstance() {
            return sInstance;
        }
    }
    
[/code]

MainActivity

[code]

    protected static void connectGooglePlayServices() {
            Context mcontext = ApplicationController.getInstance().getApplicationContext();
    
            locationClient = new GoogleApiClient.Builder(mcontext)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks((GoogleApiClient.ConnectionCallbacks) mcontext)
                    .addOnConnectionFailedListener((GoogleApiClient.ConnectionCallbacks) mcontext)       
                    .build();
    
            if (REQUEST != null) {
                // GoogleApiClient start
                locationClient.connect();
            }
        }
    
[/code]

エラー  
01-07 14:59:31.856 5588-5588/com.testxxx E/AndroidRuntime: FATAL EXCEPTION:
main java.lang.RuntimeException: Unable to start receiver
com.testxxx.GcmBroadcastReceiver: java.lang.ClassCastException:
com.testxxx.ApplicationController cannot be cast to
com.google.android.gms.common.api.GoogleApiClient$ConnectionCallbacks


CC BY-SA 3.0
2016-01-07T07:00:19.763
20704
2016-01-08T18:38:09.243
8670
question
android google-play-service
GoogleApiClient.Builderをstaticで使用する方法を教えて下さい。

[code]

    locationClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)        //利用するAPIの指定
                .addConnectionCallbacks(this)        //接続完了リスナ
                .addOnConnectionFailedListener(this) //接続失敗リスナ                      
                .build();
    
[/code]

上記にでてくる「this」のうち、`GoogleApiClient.Builder(this)`のthisはContextですが、

残りの二つはContextではなく、コメントの通りリスナを実装したオブジェクトです。

おそらくコピペ元ではたまたまActivityなどが`GoogleApiClient.ConnectionCallbacks`と`GoogleApiClient.OnConnectionFailedListener`をimplementsしていたため、全てthisになっていたと思います。

なのでaddConnectionCallbacksとaddOnConnectionFailedListenerの引数にContextを入れるのは間違いです。（キャストする前はコンパイルできなかったはず）

ゆえに下記のように匿名クラスを使うとよいと思います。

ただし、staticメソッドでGooglePlayServicesを使う必要があるかやApplicationを継承したクラスのContextを持ってくる必要があるかなどは別の問題であり、別途検討する必要があります。

[code]

    protected static void connectGooglePlayServices() {
        Context mcontext = ApplicationController.getInstance().getApplicationContext();
    
        locationClient = new GoogleApiClient.Builder(mcontext)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks(){
    
                    @Override
                    public void onConnected(Bundle bundle) {
    
                    }
    
                    @Override
                    public void onConnectionSuspended(int i) {
    
                    }
                })
                .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult connectionResult) {
    
                    }
                })
                .build();
    
        if (REQUEST != null) {
            // GoogleApiClient start
            locationClient.connect();
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-01-08T18:38:09.243
20761
2016-01-08T18:38:09.243
7256
20704
answer