Не удается разрешить GOOGLE_FIT_PERMISSIONS_REQUEST_CODE - PullRequest
0 голосов
/ 12 сентября 2018

Я использую Google Fit API в Android Studio, и я следовал этому руководству , но произошла ошибка со словами:

не может разрешить символ.

Я искал решение для этого, но не смог найти.

Я также разместил зависимости на модуле, как сказано на их веб-сайте.

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 голосов
/ 18 декабря 2018

Код запроса является частью шаблона проектирования обратного вызова службы.То, как написан пример, подразумевает возможность того, что код вашего приложения каким-то образом получит обратный вызов для запроса на обслуживание, который был сделан другим экземпляром клиента.

Передан тест на соответствующий параметр requestCode в onActivityResult () - это защитный код для защиты экземпляра кода вашего приложения, отвечающего на результат запроса на обслуживание, который он не инициировал.Поскольку мы говорим о разрешениях приложений здесь, это проблема конфиденциальности и безопасности.Этот гипотетический «обратный вызов румян» может быть сгенерирован вредоносным ПО на пользовательском устройстве, либо скомпрометированной конечной точкой службы, либо каким-либо злоумышленником в сети (MITM).

К сожалению,жесткое кодирование фиксированного requestCode , как это часто делается, может не обеспечить наилучшую защиту от этого сценария, поскольку каждый экземпляр вашего класса использует одно и то же значение.

Для более динамического значения requestCode вы можете использовать что-то подобное вместо этого (отметив, что коду запроса разрешено использовать только младшие 16 битов целого числа, поэтому мы маскируем его с помощью побитового оператора '&'):

final int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = System.identityHashCode(this) & 0xFFFF;
0 голосов
/ 12 сентября 2018

Вы не определили это.

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