2015-04-06 4 views
6

Я начал создавать Watch Face для Android Wear. Я реализовал почти все, и теперь я хочу показать на лице аккумулятор телефона. Из того, что я понял после моего исследования, это можно сделать только через API сообщений или данных. Поэтому я начал работать в своей области, но перед лицом проблемы в самом начале. Я не могу подключиться к клиенту Google Api.NullPointerException при создании экземпляра GoogleApiClient

У меня есть два класса под «носить» - один общий для часов (службы) и один созданный мной:

public class BatteryActivity extends Activity { 

    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(new ConnectionCallbacks() { 
      @Override 
      public void onConnected(Bundle connectionHint) { 
       Log.i("", "onConnected: " + connectionHint); 
       // Now you can use the Data Layer API 
      } 
      @Override 
      public void onConnectionSuspended(int cause) { 
       Log.i("", "onConnectionSuspended: " + cause); 
      } 
     }) 
     .addOnConnectionFailedListener(new OnConnectionFailedListener() { 
      @Override 
      public void onConnectionFailed(ConnectionResult result) { 
       Log.i("", "onConnectionFailed: " + result); 
      } 
     }) 
       // Request access only to the Wearable API 
     .addApi(Wearable.API) 
     .build(); 
} 

Whan я просто экземпляр это так: BatteryActivity batteryActivity = new BatteryActivity(); Я получаю эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference

Я не понимаю, как mGoogleApiClient имеет значение null, если у меня есть его экземпляр. В качестве примечания - это чисто основано на документации Google здесь - https://developer.android.com/training/wearables/data-layer/messages.html

+1

Никогда экземпляр класса Activity – Nabin

ответ

6

Я полагаю, вы должны построить GoogleApiClient по методу onCreate. Ваш код будет выглядеть так:

public class BatteryActivity extends Activity { 

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

     GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(new ConnectionCallbacks() { 
       @Override 
       public void onConnected(Bundle connectionHint) { 
        Log.i("", "onConnected: " + connectionHint); 
        // Now you can use the Data Layer API 
       } 
       @Override 
       public void onConnectionSuspended(int cause) { 
        Log.i("", "onConnectionSuspended: " + cause); 
       } 
      }) 
      .addOnConnectionFailedListener(new OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(ConnectionResult result) { 
        Log.i("", "onConnectionFailed: " + result); 
       } 
      }) 
     // Request access only to the Wearable API 
     .addApi(Wearable.API) 
     .build(); 
    } 
} 
0

В идеале это должно быть сделано с помощью асинхронной задачи: https://developer.android.com/google/auth/api-client.html#Communicating

private class WatchTask extends AsyncTask<String, Void, Void> { 
    protected void doInBackground(String text) { 

Или быстро исправить, вы просто можете использовать это в неправильном месте:

в вашем onCreate использовании getActivity() или this использовать Context для этой линии:

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) 

Я также хотел бы предложить проверить: http://developer.android.com/training/wearables/data-layer/index.html

Если вы действительно хотите использовать активность, то это будет выглядеть примерно так:

public class MainActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, MessageApi.MessageListener { 

    private GoogleApiClient googleClient; // A google client for Wear interaction 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Build a new GoogleApiClient that includes the Wearable API 
     googleClient = new GoogleApiClient.Builder(this) 
       .addApi(Wearable.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     Wearable.MessageApi.addListener(googleClient, this); 
    } 

    @Override 
    public void onMessageReceived(MessageEvent messageEvent) { 
     //Same onMessageReceived as in WearableListenerService 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { } 
    @Override 
    public void onConnectionSuspended(int i) { } 
} 
+0

я в конечном итоге переместить всю логику основной службы циферблата. Сейчас это работает, но класс выглядит ужасно. Теперь, когда у меня это работает, я посмотрю, как я могу его переместить. Спасибо всем за помощь! –

1

Это также происходит, когда не обеспечивает надлежащий контекст. Проходит контекст так:

mGoogleApiClient = new GoogleApiClient.Builder(context) // Pass context here 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API).build(); 
Смежные вопросы