为啥 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工具的使用详解