为啥 lint 在 Android Studio 中获取联系人列表名称和号码时显示“值 >= 1”?

Posted

技术标签:

【中文标题】为啥 lint 在 Android Studio 中获取联系人列表名称和号码时显示“值 >= 1”?【英文标题】:Android studio Lint asks for a value >= 1 even if it's impossible?为什么 lint 在 Android Studio 中获取联系人列表名称和号码时显示“值 >= 1”? 【发布时间】:2022-01-21 19:24:36 【问题描述】:

我正在 android Studio 中创建一个简单的短信应用程序,但每当我尝试通过定义 getContactList() 函数从用户手机中获取联系人列表时,lint 会显示一个错误,即范围值应大于一。为什么会来?我检查了许多来源,并且编写了与他们编写的完全相同的代码。这是确切的代码:

package com.example.safechat;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.LinearLayout;

import java.util.ArrayList;

public class FindUserActivity extends AppCompatActivity 

    private RecyclerView.Adapter mUserListAdapter;

    ArrayList<UserObject> userList;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find_user);

        userList = new ArrayList<>();

        initializeRecyclerView();
    

    private void getContactList() 
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        while(phones.moveToNext()) 
            String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); //Value should be >= 1
            String phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //Value should be >= 1

            UserObject mContact = new UserObject(name, phone);
            userList.add(mContact);
            mUserListAdapter.notifyDataSetChanged();
        
    

    private void initializeRecyclerView() 
        RecyclerView mUserList = findViewById(R.id.userList);
        mUserList.setNestedScrollingEnabled(false);
        mUserList.setHasFixedSize(false);
        RecyclerView.LayoutManager mUserListLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
        mUserList.setLayoutManager(mUserListLayoutManager);
        mUserListAdapter = new UserListAdapter(userList);
        mUserList.setAdapter(mUserListAdapter);
    

lint 不清楚我该怎么做,如果你能帮忙,那就是你的好意。

【问题讨论】:

【参考方案1】:

因为如果列不存在,getColumnIndex() 返回 -1。 phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) 的返回值在运行前是未知的。如果他们碰巧返回 -1,phones.getString(-1) 将抛出。理想情况下,您应该检查getColumnIndex() 的返回值,然后再将其传递给getString()

【讨论】:

好的,总之我不需要修改我的代码,不是吗?但是在运行时,如果getColumnIndex() 返回-1,我的应用程序会崩溃还是只会记录错误? 除非你将它包装在一个 try catch 块中,否则它会崩溃。一般来说,您不需要修改代码,因为数据库是由您构建的,并且您知道列存在。但是你知道,事情可能会出错,即使你不知道它怎么可能。您可以决定是否要提供这些额外的保护。

以上是关于为啥 lint 在 Android Studio 中获取联系人列表名称和号码时显示“值 >= 1”?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何配置 Android Studio 以在每次构建时运行它的 Lint?

Android Lint——内嵌于Android Studio的代码优化工具

Android学习之Android studio TraceView和lint工具的使用具体解释

Android学习之Android studio TraceView和lint工具的使用详解

Android Studio中不同的构建类型使用不同的lint.xml吗?

Android Studio Lint 检查不必要的模块依赖