记录思考

Androd Intent ACTION_PICK 获得空的 cursor

在 Android 中,发起一个 Intent.ACTION_PICK 的 Intent 后,可以唤起通讯录,选择一个电话号码。

在 Android 中,发起一个 Intent.ACTION_PICK 的 Intent 后,可以唤起通讯录,选择一个电话号码。通过这种方式,可以省去通讯录权限的申请,不需要在 manifest 文件中声明通讯录的读写权限,也不需要在获取的时候动态的申请权限。在用户选择某一个电话号码后,会回调 Activity.onActivityResult() 方法。在该方法中,你可以得到一个 Uri 对象,然后在调用 ContentResolver.query() 方法获得一个 cursor。

在大部分情况下,这个办法是可以正常使用的。但是在实际的使用中,发现这样的现象。用户选择了某个电话号码后,onActivityResult() 方法回调了,获得到 cursor 对象了,但是 cursor 是 empty 的。也就是 cursor.moveToFirst() 方法会返回 false 。

个人认为这应该是部分手机授权机制出现了一些 bug。我发现的是一个华为的破手机,屏幕还贼大。

D/StubController: holdAndGetPermissionType permissionType:1 uid:10406 pid:3242
D/StubController: addRequestCount, mRequestCount =1 mPhoneIDRequestCount: 0 mLocationRequestCount: 0 permissionType is: 1
D/StubController: holdForGetPermissionSelection  mRequestCount:1
D/StubController: beforeShowDialogCheckResult:2
D/StubController: minusRequestCount, mRequestCount =0 mPhoneIDRequestCount: 0 mLocationRequestCount: 0 permissionType is: 1

注意到, beforeShowDialogCheckResult:2 这行日志,正常的情况下,beforeShowDialogCheckResult 是 1 ,但出现 cursor 为 empty 的时候,beforeShowDialogCheckResult 为 2。而且这是偶发的情况,也就是说,同一个电话号码,我多次选择,偶尔会发现这种情况,在大部分情况下,同一个电话号码,也就是同一个 Uri,是可以正常的拿到 cursor 里的数据。所以我认为应该是临时授权或者是权限检查出现的问题。

https://stackoverflow.com/questions/16577515/intent-action-pick-returns-empty-cursor-for-some-contacts

- EOF -

本文链接 https://spacepage.top/articles/2018.08.07-12_24_16-intent-action-pick.html,欢迎转载,转载请注明出处。