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;
}
}