Android应用程序在尝试访问Google Fit API的Fitness.getHistoryClient时出现故障



我试图通过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证书指纹与安卓工作室用于签署应用程序的指纹不匹配。这是由于在安卓工作室的两个不同安装中编译该应用程序造成的。

通过添加第二个OAuth 2.0-Client-ID和第二个Android Studio安装的证书,问题得到了解决。

相关内容

  • 没有找到相关文章

最新更新