Android Git联系人提取库集成、权限及使用方法咨询
关于集成Android Contact Extractor的完整指南
别担心,作为Android新手遇到这些问题很正常,我一步步给你讲清楚所有疑问和操作步骤:
1. 不需要把包提取到本地,直接用远程依赖即可
这个库已经发布到Maven公共仓库了,你完全不用手动复制代码到本地项目。只需要通过Gradle配置依赖,它会自动帮你下载并引入库文件:
- 打开Module级别的
build.gradle(注意不是Project级别的配置文件),在dependencies代码块里添加:implementation 'com.coderconsole.cextracter:contact-extractor:1.0.0' - 点击Android Studio右上角的「Sync Now」按钮,等待Gradle同步完成即可。
2. 原Git项目清单没有READ_CONTACTS权限的原因
这个项目是一个Android Library模块,不是独立的Android应用。在Android开发规则里,库模块不需要声明它用到的权限——权限是属于最终打包的宿主应用的。库只是“调用”这个权限,但必须由你的APP在自己的AndroidManifest.xml中声明,系统才会识别并允许APP访问联系人。所以你自己的APP清单里必须添加这个权限,而原项目的库清单不需要。
3. 完整集成&使用步骤(含权限请求和按钮功能)
我把步骤拆得非常细,跟着做就能实现需求:
步骤1:添加权限到你的APP清单
打开AndroidManifest.xml,在<manifest>标签内(<application>标签外面)添加权限声明:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
步骤2:在布局中添加「访问联系人列表」按钮
打开你的Activity布局文件(比如activity_main.xml),添加一个按钮:
<Button android:id="@+id/btn_get_contacts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="访问联系人列表"/>
步骤3:实现权限请求和联系人获取逻辑
下面提供Kotlin和Java两种版本的代码,你可以根据自己的开发语言选择:
Kotlin版本示例
import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.coderconsole.cextracter.ContactExtractor import com.coderconsole.cextracter.model.Contact class MainActivity : AppCompatActivity() { private val READ_CONTACTS_REQUEST_CODE = 1001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val btnGetContacts = findViewById<Button>(R.id.btn_get_contacts) btnGetContacts.setOnClickListener { checkAndRequestContactsPermission() } } // 检查权限,未授予则发起请求 private fun checkAndRequestContactsPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.READ_CONTACTS), READ_CONTACTS_REQUEST_CODE ) } else { // 权限已授予,直接获取联系人 fetchContacts() } } // 处理权限请求结果 override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == READ_CONTACTS_REQUEST_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchContacts() } else { Toast.makeText(this, "需要权限才能访问联系人", Toast.LENGTH_SHORT).show() } } } // 获取联系人并输出到日志/Toast private fun fetchContacts() { val contactExtractor = ContactExtractor(this) val contacts: List<Contact> = contactExtractor.extractContacts() // 输出联系人信息到Logcat contacts.forEachIndexed { index, contact -> Log.d("Contacts", "联系人${index+1}: 姓名=${contact.name}, 电话=${contact.phoneNumber}") } // 用Toast显示联系人总数(联系人太多时Toast显示不全,优先看Logcat) Toast.makeText(this, "共获取到${contacts.size}个联系人", Toast.LENGTH_LONG).show() } }
Java版本示例
import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.coderconsole.cextracter.ContactExtractor; import com.coderconsole.cextracter.model.Contact; import java.util.List; public class MainActivity extends AppCompatActivity { private static final int READ_CONTACTS_REQUEST_CODE = 1001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnGetContacts = findViewById(R.id.btn_get_contacts); btnGetContacts.setOnClickListener(v -> checkAndRequestContactsPermission()); } private void checkAndRequestContactsPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE ); } else { fetchContacts(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == READ_CONTACTS_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchContacts(); } else { Toast.makeText(this, "需要权限才能访问联系人", Toast.LENGTH_SHORT).show(); } } } private void fetchContacts() { ContactExtractor contactExtractor = new ContactExtractor(this); List<Contact> contacts = contactExtractor.extractContacts(); for (int i = 0; i < contacts.size(); i++) { Contact contact = contacts.get(i); Log.d("Contacts", "联系人" + (i+1) + ": 姓名=" + contact.getName() + ", 电话=" + contact.getPhoneNumber()); } Toast.makeText(this, "共获取到" + contacts.size() + "个联系人", Toast.LENGTH_LONG).show(); } }
步骤4:测试运行
启动APP后点击按钮:
- 首次打开会弹出权限请求对话框,点击「允许」;
- 之后就能在Logcat中看到完整的联系人信息,同时Toast会提示联系人总数。
内容的提问来源于stack exchange,提问作者user2947950




