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

与 Android 应用 Google-Fit 同步权限

如何解决与 Android 应用 Google-Fit 同步权限

我正在使用 android studio 创建一个应用程序,我正在使用 Google Fit 应用程序来同步两者以通过 Mi-Fit 进行一些测量。问题是我的手机没有弹出获取权限窗口,我不知道为什么。这是我的权限类:

package Model.Users;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInoptionsExtension;
import com.google.android.gms.fitness.fitnessOptions;

import static com.google.android.gms.fitness.data.DataType.TYPE_ACTIVITY_SEGMENT;
import static com.google.android.gms.fitness.data.DataType.TYPE_CALORIES_EXPENDED;
import static com.google.android.gms.fitness.data.DataType.TYPE_disTANCE_DELTA;
import static com.google.android.gms.fitness.data.DataType.TYPE_STEP_COUNT_DELTA;

public class Permissions {

    private AppCompatActivity app;
    final private int ALL_PERMISSIONS = 101;

    public Permissions(AppCompatActivity app) {
        this.app = app;
    }

    /**
     *
     * @throws PackageManager.NameNotFoundException
     */
    public void requestPermissions() throws PackageManager.NameNotFoundException {
        PackageInfo info = app.getPackageManager().getPackageInfo(app.getPackageName(),PackageManager.GET_PERMISSIONS);
        String[] permissions = info.requestedPermissions;//This array contains the requested permissions.

        Log.i("PERMISSIONS","************PERMISSIONS LIST*************");

        ActivityCompat.requestPermissions(app,permissions,ALL_PERMISSIONS); /** gets all permissions from manifest! */

        // insert all permissions needed
        GoogleSignInoptionsExtension fitnessOptions =
                fitnessOptions.builder()
                        .addDataType(TYPE_STEP_COUNT_DELTA,fitnessOptions.ACCESS_READ)
                        .addDataType(TYPE_disTANCE_DELTA,fitnessOptions.ACCESS_READ)
                        .addDataType(TYPE_CALORIES_EXPENDED,fitnessOptions.ACCESS_READ)
                        .addDataType(TYPE_ACTIVITY_SEGMENT,fitnessOptions.ACCESS_READ)
                        .build();

        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(app),fitnessOptions)) {
            GoogleSignIn.requestPermissions( app,1,GoogleSignIn.getLastSignedInAccount(app),fitnessOptions);
            Log.i("PERMISSIONS","************PERMISSIONS REQUESTED*************");

        }
    }
}

我得到的第一个屏幕是选择谷歌帐户:

this screen pops up

总是那么我想得到这个屏幕,但我几乎从不这样做:

almost never pops up

然后弹出批准位置的最终屏幕:

permissions from phone always pops up

无法弄清楚为什么第二个屏幕不显示,我必须获得这些权限才能管理 google-fit 收集的数据的使用

谢谢。

解决方法

将您的逻辑放在自己的函数中,在 onCreate() 之外。

private void youLogic() {
    // some code
}

如果权限被授予,直接从 onCreate() 调用该函数:

@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    if (checkSelfPermissions(/*whatever*/) {
        youLogic();
    } else {
        requestPermissions(/*whatever*/);
    }

    //nothing dependent on runtime permissions after this point
}

然后覆盖 onRequestPermissionsResult():

@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
    if (requestCode == /*whatever you set in requestPermissions()*/) {
        if (!Arrays.asList(grantResults).contains(PackageManager.PERMISSION_DENIED)) {
            //all permissions have been granted
            youLogic(); //call your dependent logic
        }
    }
}

您还可以检查清单中的所有权限:

if(permissions.Contains(info)) {
  
  // request all other permissions here
  .
  .
  .
}

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