运行时权限

  • 使用ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED//判断是否有权限
  • ActivityCompat.requestPermissions(MainActivity.this,

    new String[] {Manifest.permission.CALL_PHONE},1);//没有权限 进行申请
  • onRequestPermissionResult() //无论哪种结果都会回调到这个函数中 所以重写这个函数

makecallButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.

permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED)

ActivityCompat.requestPermissions(MainActivity.this,

new String[] {Manifest.permission.CALL_PHONE},1);

else

call();

}

});

private void call()

{

try{

Intent intent = new Intent (Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:10086"));

startActivity(intent);

}

catch (SecurityException e)

{

e.printStackTrace();

}

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length >0 && grantResults[0]== PackageManager.PERMISSION_GRANTED)
call();
else
Toast.makeText(MainActivity.this,"you denied the permission",Toast.LENGTH_LONG).show();
break;
default:
}
}

}

查找联系人姓名和电话

ListView contactsView = (ListView) findViewById(R.id.listview);

adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,contactsList);

contactsView.setAdapter(adapter);

if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!=

PackageManager.PERMISSION_GRANTED)

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission

.READ_CONTACTS},2);

else {

readContanct();

}

private void readContanct()

{

Cursor cursor = null;

try{

cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

null,null,null,null);

if(cursor != null)

while (cursor.moveToNext()){

String displayName = cursor.getString(cursor.getColumnIndex

(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

String number =cursor.getColumnName(cursor.getColumnIndex

(ContactsContract.CommonDataKinds.Phone.NUMBER));

contactsList.add(number);

adapter.notifyDataSetChanged();

}

}

catch (Exception e)

{

e.printStackTrace();

}

finally {

if(cursor!=null)

cursor.close();

}

}

Android Studio 学习(六)内容提供器的更多相关文章

  1. android学习十二(android的Content Provider(内容提供器)的使用)

    文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中訪问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能 ...

  2. android: 创建自己的内容提供器

    我们学习了如何在自己的程序中访问其他应用程序的数据.总体来说思 路还是非常简单的,只需要获取到该应用程序的内容 URI,然后借助 ContentResolver 进行CRUD 操作就可以了.可是你有没 ...

  3. Android入门(十四)内容提供器-实现跨程序共享实例

    原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...

  4. Android搜索框以及内容提供器

    先看结果: 相关的官方文档在这里:Creating a Search Interface Android官方提供了两种方式: 弹出一个Dialog,覆盖当前的Activity界面 在AppBar中扩展 ...

  5. <Android基础> (七)内容提供器

    第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...

  6. android笔记 : Content provider内容提供器

    内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能. 内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内 ...

  7. Android Studio 学习Demo内容及一些bug处理技巧 -----个人技术文档,两次冲刺总结

    实现的基本内容 1.基本界面的注册(包括转换界面,隐式,显式注册,主界面的入口注册) 2.匿名内部类实现Button按钮的监听事件,并通过Toast进行显示 3.界面切换(显式.隐式) 4.调用浏览器 ...

  8. Android学习之基础知识十—内容提供器(Content Provider)

    一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...

  9. Android学习笔记(二十)——自定义内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 如果我们想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 Conten ...

  10. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

随机推荐

  1. JavaScript中常见的10个BUG及其修复方法

    如今网站几乎100%使用JavaScript.JavaScript看上去是一门十分简单的语言,然而事实并不如此.它有很多容易被弄错的细节,一不注意就导致BUG. 1. 错误的对this进行引用 在闭包 ...

  2. 深入理解java反射原理

    反射是java的一个特性,这一特性也使得它给了广大的第三方框架和开发过者很大的想像空间. 通过反射,java可以动态的加载未知的外部配置对象,临时生成字节码进行加载使用,从而使代码更灵活!可以极大地提 ...

  3. 使用redis配置分布式session

    1. spring-redis-session 1.1. 配置 /** * @author laoliangliang * @date 2018/12/21 17:19 */ @Configurati ...

  4. CI-CD平台搭建过程整理

    Coding ---> gitlab  --->jenkins ---> maven(nexus) ---> 编译构建成image ---> Harbor ---> ...

  5. Spring详解(六)------AspectJ 实现AOP

    上一篇博客我们引出了 AOP 的概念,以及 AOP 的具体实现方式.但是为什么要这样实现?以及提出的切入点表达式到底该怎么理解? 这篇博客我们通过对 AspectJ 框架的介绍来详细了解. 1.什么是 ...

  6. Python中变量的基本使用

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  7. SpringBoot2.1整合finereport10(帆软报表)

    最近,公司采购了帆软的系统,领导安排要与公司的SpringBoot框架进行整合.费了一番牛劲,终于整合成功,下面分享一下我的经验. 首先,我的开发环境是Intellij IDEA,使用的SpringB ...

  8. odoo开发笔记--from视图隐藏顶部&tree视图保留

    场景描述: 开发过程中,有时候我们需要去除odoo自带的一些样式, 比如,form视图,要集成自定义的界面时,就希望把顶部的服务动作 和 分页按钮 隐藏掉. 处理方式: 分两种情况: 1. 保留顶部区 ...

  9. TransactionScope事务处理方法介绍及.NET Core中的注意事项

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.html 今天在写CzarCms的UnitOfWork的使用使用到了这个Transacti ...

  10. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...