微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试访问 Google Fit API 的 Fitness.getHistoryClient 时,Android 应用程序崩溃

如何解决尝试访问 Google Fit API 的 Fitness.getHistoryClient 时,Android 应用程序崩溃

我正在尝试通过 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 安装的证书解决。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。