我的代码看起来像这样:
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()
。
我将需要权限的代码移动到该功能中,但它再次给了我一个红色的曲折,告诉我需要请求许可。
现在我很困惑。
答案 0 :(得分:0)
Android Marshmallow引入了全新的应用程序权限,用户现在可以随时撤消运行时权限。这意味着您无法假定应用程序可以访问该权限,即使之前已授予该权限。您可以参考PermissionsDispatcher lib或此guide。我希望这会帮助您。
答案 1 :(得分:0)
我认为你提到的 red zigzag 是一个lint警告。如果不是这样,请澄清一下,我会更新我的答案。
如果我们正在谈论一个lint警告,这首先意味着它通常不是什么大不了的,你仍然可以编译,因为lint警告更像是建议而不是硬性要求。但是,一些包含lint检查的构建系统无论如何都会失败,所以我明白为什么你可能有兴趣解决这个问题,除了它在视觉上很烦人。
当然,警告是有原因的,但是静态程序分析很容易过度逼近,因此在您的情况下,它似乎是误报,或者在某些情况下(可能是极端情况)未达到检查的情况,也许是一个奇怪的回调序列。
因此,如果您确定在检查和请求权限方面做得相当不错,则可以取消警告。 Android Studio为您提供了多种可能性,但如果您喜欢手动执行此操作,则可以在//noinspection MissingPermission
调用的正上方添加query
。