我的应用程序在try 读取联系人时崩溃.错误消息

java. lang. RuntimeException:无法启动Activity AddressInfo {com. ccoders. contactlistjava/com. ccoders. contactlistjava. MainActivity}:android. data. StaleDataException:试图在关闭游标后访问游标.

我起初以为这是读取联系人的权限问题.但看起来有什么问题,阅读联系人.

这是我们的密码:

public class MainActivity extends AppCompatActivity {

    // Initialize variable
    RecyclerView recyclerView;
    ArrayList<ContactModel> arrayList = new ArrayList<ContactModel>();
    MainAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        // requesting to the user for permission.

        //checking whether the read contact permission is granted.
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

            System.out.println("Permission is not granted");
            // requesting to the user for permission.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 100);

        } else {
            System.out.println("Permission is granted");
            //if app already has permission this block will execute.
            getContactList();
        }
    }
    // if the user clicks ALLOW in dialog this method gets called.
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        getContactList();
    }


    private void getContactList() {

        // Initialize uri
        Uri uri = Contacts.CONTENT_URI;

        // Sort by ascending
        String sort = CommonDataKinds.Phone.DISPLAY_NAME+" ASC";

        // Initialize cursor
        Cursor cursor = getContentResolver().query(
                uri, null, null, null, sort
        );

        // Check condition

        if (cursor.getCount() > 0) {
            // When cursor is greater than 0
            // Use while loop

            while(cursor.moveToNext()){
                // Cursor move to next
                // Get contact id

                String id = cursor.getString(cursor.getColumnIndexOrThrow(Contacts._ID));

                // Get contact name

                String name = cursor.getString(cursor.getColumnIndexOrThrow(Contacts.DISPLAY_NAME
                ));
                // Initialze phone uri
                Uri uriPhone = CommonDataKinds.Phone.CONTENT_URI;
                // Initialize selection
                String selection = CommonDataKinds.Phone.CONTACT_ID + " =?";

                // Initialize phone cursor
                Cursor phoneCursor = getContentResolver().query(
                        uriPhone, null, selection, new String[]{id},null
                );
                // Check condition
                if (phoneCursor.moveToNext()){
                    // When phone cursor move to next
                    String number = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(
                            CommonDataKinds.Phone.NUMBER
                    ));
                    // Initialze contact model
                    ContactModel model = new ContactModel();
                    // Set name
                    model.setName(name);
                    // Set number
                    model.setNumber(number);
                    // Add model in array list
                    arrayList.add(model);
                    // Close phone cursor
                    phoneCursor.close();
                }

                // Close cursor
                cursor.close();
            }

            // Set layout manager
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            // Initialize adapter
            adapter = new MainAdapter(this,arrayList);
            // Set adapter
            recyclerView.setAdapter(adapter);
        }
    }
}

我该怎么解决这个问题?

推荐答案

  1. 您正在使用System. out. println(),这在Android中不受支持,因为它没有控制台,所以使用Logger来获取日志(log)

  2. 根据例外,您正在关闭光标后,读取第一个数据从联系人列表.因此,将cursor. close()设置在while循环之外

Java相关问答推荐

Java JAR环境(JRE)是否支持模块?

如何在访问完所有文件后加入所有线程?

AssertJ Java:多条件断言

相同的Java SerializedLambda为implMethodKind返回不同的结果

Spark忽略Iceberg Nessie目录

为什么Java编译器不区分不同类型的方法?

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

Docker不支持弹性APM服务器

WebSockets和Spring Boot安全性出现错误401

在settings.gradle.kts和Build.gradle.kts中使用公共变量

删除打印语句会影响功能...腐败在起作用?

从映射列表中检索所有键

为什么在下面的Java泛型方法中没有类型限制?

泛型与泛型问题的完美解决方案?

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

无限递归Java问题

Java System.getProperty在哪里检索user.home?

整数->;双取消框,但双->;int不';t开箱.为什么?

转换为JSON字符串时,日期按天递减-Java

使用DynamoDB增强客户端时未更新属性