Java READ_联系人权限不工作

Java READ_联系人权限不工作,java,android,android-studio,Java,Android,Android Studio,在emulator中运行以下代码时,会显示以下消息: “应用程序已停止” 我正在尝试读取联系人并创建一个列表视图,该视图显示联系人并允许用户选择他们的紧急联系人 这是我的代码: 公共类ContactsActivity扩展AppCompativity实现AdapterView.OnItemClickListener{ 最终int请求\读取\联系人=123; MyAdapter madapt; ArrayList store=新的ArrayList(); 字符串s1、s2、s3、s4; 字符串换行

在emulator中运行以下代码时,会显示以下消息: “应用程序已停止”

我正在尝试读取联系人并创建一个列表视图,该视图显示联系人并允许用户选择他们的紧急联系人

这是我的代码:

公共类ContactsActivity扩展AppCompativity实现AdapterView.OnItemClickListener{
最终int请求\读取\联系人=123;
MyAdapter madapt;
ArrayList store=新的ArrayList();
字符串s1、s2、s3、s4;
字符串换行符=“\n”;
按钮b;
复选框cb;
FileOutputStreamOut1;
列表名称1=新的ArrayList();
List phone1=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
AlertDialog.Builder alert=新建AlertDialog.Builder(此);
alert.setNegativeButton(“确定”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
}
})
.setMessage(“此应用程序要求GPS正常工作。请在使用此应用程序时始终启用GPS。”)
.show();
getContacts(this.getContentResolver());
ListView lv=(ListView)findViewById(R.id.lv);
madapt=新的MyAdapter();
低压设置适配器(madapt);
lv.setOnItemClickListener(本);
lv.setItemsCanFocus(假);
lv.setTextFilterEnabled(真);
b=(按钮)findViewById(R.id.Button);
File File=新文件(getFilesDir(),“contacts”);
试一试{
out1=openFileOutput(“contacts”,Context.MODE\u PRIVATE);
}catch(filenotfounde异常){
}
b、 setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(!store.isEmpty()){
for(字符串s:store){
s1=s。替换(“(”,”);
s2=s1。替换(“)”,“);
s3=s2。替换(“,”);
s4=s3。替换(“-”,”);
试一试{
out1.write(s4.getBytes());
out1.write(newline.getBytes());
}捕获(IOE异常){
e、 printStackTrace();
}
//TODO:专心工作
Intent sendstoredcontacts=新的Intent(ContactsActivity.this,FirstActivity.class);
sendstoredcontacts.putStringArrayListExtra(“CONTACTS”,store);//getText()不应该是静态的!!!
startActivity(sendstoredcontacts);
}
}否则{
Toast.makeText(ContactsActivity.this,“必须至少选择一个联系人!”,Toast.LENGTH\u SHORT.show();
}
}
});
}
私有void getContacts(ContentResolver cr){
游标phones=cr.query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,null,null,null);
while(phones.moveToNext()){
字符串名称=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_name));
String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
系统输出打印项次(……“+电话号码);
名称1.添加(名称);
电话1.添加(电话号码);
}
电话。关闭();
}
公共无效askForContactPermission(){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
如果(ContextCompat.checkSelfPermission)(ContactsActivity.this,
Manifest.permission.READ_联系人)
!=PackageManager.权限(已授予){
//未授予许可
//我们应该解释一下吗?
如果(ActivityCompat.shouldshowRequestPermissionPrinciple)(ContactsActivity.this,
清单。权限。读取(联系人)){
//向用户显示解释*异步*--不阻止
//此线程正在等待用户的响应!在用户
//请查看说明,然后重试请求权限。
}否则{
//无需解释;请求许可
ActivityCompat.requestPermissions(ContactsActivity.this,
新字符串[]{Manifest.permission.READ_CONTACTS},
请求(读取)(联系人);;
//我的\u权限\u请求\u读取\u联系人是
//应用程序定义的int常量。回调方法获取
//请求的结果。
}
}否则{
//已授予许可
}
}
}
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
}
类MyAdapter扩展了BaseAdapter{
更扁平的inf;
MyAdapter(){
inf=(LayoutInflater)ContactsActivity.this.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}
@凌驾
public int getCount(){
返回name1.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图vi=转换视图;
//if(convertView!=null)
vi=inf.flate(R.layout.row,空)
<uses-permission android:name="android.permission.READ_CONTACTS" />
public boolean checkAndAskForContactPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(ContactsActivity.this,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            return false;
            // Permission is not granted
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(ContactsActivity.this,
                    Manifest.permission.READ_CONTACTS)) {
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
            } else {
                // No explanation needed; request the permission
                ActivityCompat.requestPermissions(ContactsActivity.this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        REQUEST_READ_CONTACTS);
                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        } else {
            return true;
            // Permission has already been granted
        }
    } else return true;
}
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);
     if (!checkAndAskForContactPermission()) return;
... your stuff here
}