Android:requestPermissions flow

时间:2016-03-13 16:05:08

标签: android android-permissions

我的代码看起来像这样:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(), DateSelectorActivity.class);
            startActivityForResult(i, 1);
        }
    });
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
        long theDate = 0;
        theDate = data.getLongExtra("theDate", theDate);
        if (theDate != 0) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CALENDAR)) {
                    Toast.makeText(getApplicationContext(),"Please?!",Toast.LENGTH_LONG).show();
                }
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CALENDAR}, 1);
                return;
            }
            doTheCalendarReading();
        } else {
            Toast.makeText(getApplicationContext(),"fail",Toast.LENGTH_LONG).show();
        }
    }
}

public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                doTheCalendarReading();
            } else {
                Toast.makeText(getApplicationContext(),"Oh well...",Toast.LENGTH_LONG).show();
            }
        }
    }
}


private void doTheCalendarReading() {
    String[] projection = new String[]{CalendarContract.Events.TITLE, CalendarContract.Events.EVENT_LOCATION};

    Calendar startTime = Calendar.getInstance();
    startTime.setTimeInMillis(theDate);
    startTime.set(Calendar.HOUR_OF_DAY, 0);
    startTime.set(Calendar.MINUTE, 0);
    startTime.set(Calendar.SECOND, 0);
    startTime.set(Calendar.MILLISECOND, 0);

    Calendar endTime = Calendar.getInstance();
    endTime.setTimeInMillis(theDate);
    endTime.set(Calendar.HOUR_OF_DAY, 23);
    endTime.set(Calendar.MINUTE, 59);
    endTime.set(Calendar.SECOND, 59);
    endTime.set(Calendar.MILLISECOND, 999);

    String selection = "(( " + CalendarContract.Events.DTSTART + " >= " + startTime.getTimeInMillis() + " ) AND ( " + CalendarContract.Events.DTSTART + " <= " + endTime.getTimeInMillis() + " ))";

    Cursor cursor = this.getBaseContext().getContentResolver().query(CalendarContract.Events.CONTENT_URI, projection, selection, null, null);

    if (cursor.moveToFirst()) {
        do {
            Toast.makeText( this.getApplicationContext(), "Title: " + cursor.getString(1) + " Start-Time: " + (new Date(cursor.getLong(3))).toString(), Toast.LENGTH_LONG ).show();
        } while ( cursor.moveToNext());
    }
}

流程一般是:当按下按钮时,我打开一个活动来接收日期(工作正常)。获得约会后,我想在该日期检索日历活动。

关于行

Cursor cursor = this.getBaseContext().getContentResolver()
                   .query(CalendarContract.Events.CONTENT_URI,
                          projection, selection, null, null);

我有一个红色的曲折告诉我应该要求相关的许可。

所以我做了,如果已经授予我的权限,我会致电doTheCalendarReading(),如果没有,我会要求获得许可,如果获得许可,我再次致电doTheCalendarReading()

我将需要权限的代码移动到该功能中,但它再次给了我一个红色的曲折,告诉我需要请求许可。

现在我很困惑。

2 个答案:

答案 0 :(得分:0)

Android Marshmallow引入了全新的应用程序权限,用户现在可以随时撤消运行时权限。这意味着您无法假定应用程序可以访问该权限,即使之前已授予该权限。您可以参考PermissionsDispatcher lib或此guide。我希望这会帮助您。

答案 1 :(得分:0)

我认为你提到的 red zigzag 是一个lint警告。如果不是这样,请澄清一下,我会更新我的答案。

如果我们正在谈论一个lint警告,这首先意味着它通常不是什么大不了的,你仍然可以编译,因为lint警告更像是建议而不是硬性要求。但是,一些包含lint检查的构建系统无论如何都会失败,所以我明白为什么你可能有兴趣解决这个问题,除了它在视觉上很烦人。

当然,警告是有原因的,但是静态程序分析很容易过度逼近,因此在您的情况下,它似乎是误报,或者在某些情况下(可能是极端情况)未达到检查的情况,也许是一个奇怪的回调序列。

因此,如果您确定在检查和请求权限方面做得相当不错,则可以取消警告。 Android Studio为您提供了多种可能性,但如果您喜欢手动执行此操作,则可以在//noinspection MissingPermission调用的正上方添加query