无法解析GOOGLE_FIT_PERMISSIONS_REQUEST_CODE

时间:2018-09-12 15:04:39

标签: android api google-fit

我在Android Studio中使用Google Fit API,但我遵循的是this tutorial,但是发生了错误,说:

  

无法解析符号。

我已经找到了解决方案,但是找不到。

我也将依赖项放在了模块gradle上,如他们的网站所述。

  

GOOGLE_FIT_PERMISSIONS_REQUEST_CODE

这是我从上述链接中复制的代码:

  public class MainActivity extends AppCompatActivity {

    @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();
        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) {
            GoogleSignIn.requestPermissions(this,  GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, GoogleSignIn.getLastSignedInAccount(this), fitnessOptions);
        } else {

            accessGoogleFit();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode ==  GOOGLE_FIT_PERMISSIONS_REQUEST_CODE) {
                accessGoogleFit();
            }
        }
    }
    private void accessGoogleFit() {
        final  String LOG_TAG="i am here";
        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()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();


        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readData(readRequest)
                .addOnSuccessListener(new OnSuccessListener() {
                    @Override
                    public void onSuccess(Object o) {
                        Log.d(LOG_TAG, "onSuccess()");
                    }


                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(LOG_TAG, "onFailure()", e);
                    }
                })
                .addOnCompleteListener(new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        Log.d(LOG_TAG, "onComplete()");
                    }
                });
    }
}

2 个答案:

答案 0 :(得分:3)

您尚未定义它。

public class MainActivity extends AppCompatActivity {
  int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 123456; //whatever you want
  // rest of the code
}

答案 1 :(得分:0)

请求代码是服务回调设计模式的一部分。该示例的编写方式暗示您的应用程序代码可能会以某种方式收到由其他客户端实例发出的服务请求的回调。

onActivityResult()中传递的匹配的 requestCode 参数的测试是一种防御性的编码防护,可以防止应用代码实例响应服务请求的结果,它没有启动。由于我们在这里谈论的是应用程序权限,因此这是隐私和安全问题。这种假想的“恶意回调”可能是由用户设备上的恶意软件,受感染的服务端点或网络上的某种中间人(MITM)攻击者产生的。

不幸的是,像通常那样对固定的 requestCode 进行硬编码可能无法提供针对这种情况的最佳保护,因为类的每个实例都使用相同的值。

要获取更动态的 requestCode 值,您可以使用类似的代码(请注意,请求代码仅允许使用整数的最低16位,因此我们使用按位的'& '运算符):

final int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = System.identityHashCode(this) & 0xFFFF;