Android Studio————权限获取

Android Studio 的 AndroidManiFest.xml 文件可以说是整个工程的指挥者了,可以在里面实现初始页面的设定,为每个页面定义Action,Title …..。例外最主要的还有一个添加权限的功能了。但是这个权限的添加就不想前面的定义那么简单了。


概述:

所谓的权限的获取,首先需要在AndroidManiFest.xml文件中添加一条相应的权限获取的语句,例如:

<uses-permission android:name = “android.permission.PERMISSIONNAME”/>

但是,有的权限并不是这样子就能够直接获取的,例如获取手机联系人的信息的话,在上述操作的基础上还需要在相应的Activity里面进行动态的获取权限。


注解:

当时刚开始接触的时候有点混乱,后来听了这样一段解释:在 AndroidManiFest.xml 里面写的那些权限呢,实际上是你随后可能需要用到的所有的权限的一个集合,就像你在手机上安装一个app的时候,它会跳出一个界面,说安装这个app需要获取那些权限,实际上这时候并没有真正意义上的获取到这些权限。在安装完成之后,我们开始使用这个app,这时候你触发了某个action,跳出了一个对话框,说“需要获取你XXX权限”,对话框下面通常都带有两个选项“允许”,“拒绝”。这就相当于一个动态获取权限的过程,如果你允许了,那这个app此时也就获取了这个权限,如果你拒绝了,那app获取不了权限,你也理所应当的使用不了这个功能了。


动态获取权限的实现(以获取联系人信息为例):

1.1 在AndroidManiFest.xml 中添加相关权限

<uses-permission android:name = “android.permission.READ_CONTACTS”/>

1.2 基于上述获取联系人权限的例子,在 MainActivity.java 中,查看当前是否获取有关权限

1.2.1. 实现getContactPermission()方法,查看当前是否获取到权限,如果获得则返回true以便于下一步操作,如果没有获取则使用ActivityCompat.requestPermissions来获取权限。

 Private boolean getContactPermission(){
        Int back = ContextCompat.checkSelfPermission(getApplicationContext(),
ManiFest.permission.READ_CONTACTS);
//查看是否获取到相关权限

If(back != PackageManager.PERMISSION_GRANTED){ //如果没有获取到权限
ActivityCompat.requestPermission(ActivityName.this,new String[]{Manifest.permission.READ_CONTACTS},10000);
/*向系统获取权限,10000是请求码,以便于下面进行验证时,区别不同的权限请求*/
return false;
/*当前整个方法的作用是检查当前是否已经获得权限,所以这里只是申请了权限,但是并不知道到底能不能获取成功,所以返回 false ,并且需要实现OnRequestPermissionResult()来再次验证此次的获取结果并进行下一步操作。*/
            }
            return ture;
}

1.2.2 实现OnRequestPermissionResult()方法,用来监听getContactPermission()方法中用ActivityCompat.requestPermissions获取权限的结果。
上述两点的相关代码:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == 10000){   
 /*判断当前是否在验证请求码为1000的请求,及READ_CONTACTS权限请求*/
                    if(grantResults == null || grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED){
                       Toast.makeText(getApplicationContext(),"对不起,用户不允许",Toast.LENGTH_SHORT).show();
            }else{
                Operation();  
 //上述getContactPermission()返回true时执行的操作
            }
      }
}

相应Activity源代码:

import android.Manifest;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class ContactsList extends AppCompatActivity {

    ContentResolver resolver ;
    Uri contactUri = ContactsContract.Contacts.CONTENT_URI;  //手机联系人
    Uri phone = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;  //联系人号码

    //权限获取
    public boolean getPermission(){
        if(ContextCompat.checkSelfPermission(ContactsList.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(ContactsList.this, new String[]{Manifest.permission.READ_CONTACTS}, 1001);
            return false;
        }
        return true;
    }

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == 1001)
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED)
                doOperation();
    }
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        resolver = getContentResolver();
        setContentView(R.layout.activity_contacts_list);
        if(getPermission())
            doOperation();
    }

    public void doOperation(){

        Cursor cur = this.resolver.query(contactUri , null ,null ,null , null ,null);
        final List<Map<String , Object>> list = getList(cur);
        ListView lv = (ListView)findViewById(R.id.lv);  
        //listview 也是AndroidStudio自带的一个常用并且功能强大但是有点难理解的一个组件
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                AlertDialog.Builder ab = new AlertDialog.Builder(ContactsList.this);
                String name = list.get(i).get("name").toString();
                String phone = list.get(i).get("phone").toString();
                ab.setTitle(name);
                ab.setMessage("联系电话:"+phone);
                ab.setPositiveButton("好的", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                });
                ab.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                });
                ab.show();
            }
        });
//-------------------------------------------------------------------------//        
        //以下是listview的相关操作
        lv.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public Object getItem(int i) {
                return null;
            }

            @Override
            public long getItemId(int i) {
                return 0;
            }

            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
                if(view == null){
                    // 创建 view
                    view = getLayoutInflater().inflate(R.layout.contactsitem,null);
                    TextView tv = (TextView)view.findViewById(R.id.tv);
                    Map<String,Object> every = list.get(i);
                    tv.setText(every.get("name").toString());
                }
                return view;
            }
        });
    }
//-------------------------------------------------------------------------//
    public List<Map<String , Object>> getList(Cursor cur){
        List<Map<String , Object>> list = new ArrayList<>();
        while(cur.moveToNext()){
            Map<String , Object> every = new HashMap<>();
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            int id = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts._ID));
            every.put("name",name);
            Log.d("debug",name);
            Cursor cur2 = resolver.query(phone , new String[]{ContactsContract.CommonDataKinds.Phone.DATA1} ,"raw_contact_id = ?" , new String[]{id + ""}, null,null);
            if(cur2.moveToNext()){
                String number = cur2.getString(cur2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                every.put("phone",number);
                Log.d("debug",number);
            }
            list.add(every);
        }
        return list;
    }
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值