问题描述
我正在尝试通过 Google Fit API 的 HistoryClient
访问步数数据,但收到以下错误消息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.fittesting,PID: 26199
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fittesting/com.example.fittesting.MainActivity}: java.lang.NullPointerException: null reference
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(UnkNown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: null reference
at com.google.android.gms.common.internal.Preconditions.checkNotNull(com.google.android.gms:play-services-basement@@17.1.1:2)
at com.google.android.gms.fitness.fitness.getHistoryClient(com.google.android.gms:play-services-fitness@@20.0.0:14)
at com.example.fittesting.MainActivity.accessGoogleFit(MainActivity.java:99)
at com.example.fittesting.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(UnkNown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
public class MainActivity extends AppCompatActivity {
public static final int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 42;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fitnessOptions fitnessOptions = fitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_DELTA,fitnessOptions.ACCESS_READ)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA,fitnessOptions.ACCESS_READ)
.build();
GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(this,fitnessOptions);
if (!GoogleSignIn.hasPermissions(account,fitnessOptions)) {
Log.d(TAG,"requesting permissions...");
GoogleSignIn.requestPermissions(
this,GOOGLE_FIT_PERMISSIONS_REQUEST_CODE,account,fitnessOptions
);
}
accessGoogleFit();
}
private void accessGoogleFit() {
Log.d(TAG,"Access Google Fit");
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
long endTime = cal.getTimeInMillis();
cal.add(Calendar.YEAR,-1);
long startTime = cal.getTimeInMillis();
DataReadRequest readRequest = new DataReadRequest.Builder()
.read(DataType.TYPE_STEP_COUNT_CUMULATIVE)
.setTimeRange(startTime,endTime,TimeUnit.MILLISECONDS)
.build();
fitness.getHistoryClient(this,GoogleSignIn.getLastSignedInAccount(this))
.readData(readRequest)
.addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
@Override
public void onSuccess(DataReadResponse dataReadResponse) {
Log.d(TAG,"HistoryClient.readData: onSuccess()");
DataSet dataSet;
List<DataSet> dataSets = dataReadResponse.getDataSets();
Log.d(TAG,"# of DataSets: " + dataSets.size());
dataSet = dataReadResponse.getDataSet(DataType.TYPE_STEP_COUNT_CUMULATIVE);
Log.d(TAG,"DataSet: " + dataSet);
Log.d(TAG,"DataSource: " + dataSet.getDataSource());
Log.d(TAG,"DataType: " + dataSet.getDataType());
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG,"HistoryClient.readData: onFailure()",e);
}
});
}
}
我认为错误可能是由某些缺少或错误的 android 权限引起的,但我无法提取错误的来源。
如果有人知道为什么会发生这种情况,我会很高兴。
此外,如果缺少某些必要信息,我很乐意补充。
非常感谢!
解决方法
如@Andy Turner 的评论中所述,该错误是由返回“null”的 GoogleSignIn.getLastSignedInAccount(this)
调用引起的。
造成这种情况的原因是谷歌云控制台中的 OAuth 配置中的 SHA1 证书指纹与 Android Studio 用于签署应用的指纹之间不匹配。 这是由于在两个不同的 Android Studio 安装中编译应用程序造成的。
问题已通过添加第二个 OAuth 2.0-Client-ID 和第二个 Android Studio 安装的证书解决。