Android进阶-屏幕滑动和获取手机联系人

原创 2015年11月19日 20:19:08

Android进阶-屏幕滑动和获取手机联系人

屏幕滑动

如何使Activity之间的切换通过手势滑动来完成呢? 使用onTouchEvent()吗? 好像是可行? 但复杂的处理用户动作算法该由你自己来实现了,
可爱的Google已经帮我们实现了, 我们可以使用GestureDetetor对象来完成这件事。

实现步骤:

  • 将onTouchEvent()委托给GestureDetetor来处理。
  • 注册GestureDetetor的GestureListener, 并重写onFling()方法。
    • Fling 可以解释为一抛, 一扔的意思, 即可以理解为响应用户有速度的滑动屏幕事件。

简单的实现屏幕滑动切换Activity的代码,在这个代码中:

  • 将左右切换Activity的实现,抽取到BaseActivity来完成
  • 若有Activity想要进行切换,只需继承这个BaseActivity,并复写showNextPage 与showPreviousPage方法
  • 前提是可以响应 next 与 previous 按钮鼠标点击事件
  • 一般有: rawX : 基于整个屏幕的X左边 X:基于控件的X坐标

如下:

    public abstract class BaseActivity extends Activity {

        private GestureDetector mDectector;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);             
            mDectector = new GestureDetector(this, new SimpleOnGestureListener() {

                /**
                 * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
                 */
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2,
                        float velocityX, float velocityY) {

                        // 判断纵向滑动幅度是否过大, 过大的话不允许切换界面
                        if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) {
                            Toast.makeText(MobileGuardBaseActivity.this, "不能这样划哦!",
                                    Toast.LENGTH_SHORT).show();
                            return true;
                        }

                        // 判断滑动是否过慢
                        if (Math.abs(velocityX) < 100) {
                            Toast.makeText(MobileGuardBaseActivity.this, "滑动的太慢了!",
                                    Toast.LENGTH_SHORT).show();
                            return true;
                        }

                        // 向右划,上一页
                        if (e2.getRawX() - e1.getRawX() > 200) {
                            showPreviousPage();
                            return true;
                        }

                        // 向左划, 下一页
                        if (e1.getRawX() - e2.getRawX() > 200) {
                            showNextPage();
                            return true;
                        }

                        return super.onFling(e1, e2, velocityX, velocityY);
                    }
                });
            }

            /**
             * 展示下一页, 子类必须实现
             */
            public abstract void showNextPage();

            /**
             * 展示上一页, 子类必须实现
             */
            public abstract void showPreviousPage();

            // 点击下一页按钮
            public void next(View view) {
                showNextPage();
            }

            // 点击上一页按钮
            public void previous(View view) {
                showPreviousPage();
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                mDectector.onTouchEvent(event);// 委托手势识别器处理触摸事件
                return super.onTouchEvent(event);
            }

    }

获取手机联系人

这件事的实现当然是依赖的内容提供者。

  1. 为了获取到联系人,共涉及到2张表(可以这么说),他们的内容提供者的Uri为:

    • content://com.android.contacts/raw_contacts (主要从这个表获取contact_id)
    • content://com.android.contacts/data (实际是view_data视图的URI)
  2. 获取代码:

    Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");  //查的不是data表, 查的实际上是view_data视图
        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();

        //raw_contacts表中获取联系人信息的ID
        Cursor queryRawC = getContentResolver().query(rawContactsUri, new String[]{"contact_id"}, null, null, null);

        while( queryRawC.moveToNext() ){
            String contactId = queryRawC.getString(0);
            Cursor dataCursor = getContentResolver().query(dataUri, new String[]{"data1", "mimetype"}, "contact_id = ?", new String[]{contactId}, null);
            if (dataCursor != null) {
                HashMap<String, String> map = new HashMap<String, String>();
                while (dataCursor.moveToNext()) {
                    String data1 = dataCursor.getString(0);
                    String mimetype = dataCursor.getString(1);
                    if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
                        map.put("phone", data1);
                    } else if ("vnd.android.cursor.item/name".equals(mimetype)) {
                        map.put("name", data1);
                    }
                }

                list.add(map);
                dataCursor.close();
            }
        }

        queryRawC.close();

应注意:

-  我们没有去查mimetype相关的表, 而是根据类型直接去判断的
-  ArrayList<HashMap<String, String>>可以直接用ListView的SimpleAdapter处理

SIM卡信息

可以使用TelephonyManager来获取, 例如:

    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String simSerialNumber = tm.getSimSerialNumber();// 获取sim卡序列号

零碎

  • Point1

    • 当我们想让用户输入号码时, 可以直接弹出号码输入框,而不是整个键盘: inputType=”phone”
  • Point2

    • 当从一个Activity返回时, 结果码有:
      • Activity.RESULT_OK:我们应手动设置这个; Activity.RESULT_CANCEL:当用户直接点解返回键是,返回的就是这个resultCode。
版权声明:本文为博主原创文章,未经博主允许不得转载。

ContentResolver获取手机联系人

首先ContentResolver是一个通过uri进行跨进程通信,如果是是自己测试的话需要一个数据库和一个ContentProvider来打开一个Uri然后用ContentResolver进入获取。 ...
  • c2248933892
  • c2248933892
  • 2017年03月29日 10:11
  • 728

Android中获取手机中的联系人信息

Android获取手机中的联系人信息
  • hong_world
  • hong_world
  • 2016年06月11日 21:22
  • 6389

Android基础:获取手机联系人工具类

Android基础:获取手机联系人工具类
  • ss1168805219
  • ss1168805219
  • 2016年04月21日 21:06
  • 1281

Android获取滑动阈值(系统认为最低的滑动距离)

获取系统认为的最低的滑动距离,即超过这个距离,系统认为这是滑动状态。 int touchSlop = ViewConfiguration.get(this).getScaledTouchSlop();...
  • Kikitious_Du
  • Kikitious_Du
  • 2017年08月11日 16:04
  • 572

滑动调节音量与屏幕亮度

public class VideoViewDemo extends Activity { private String path = Environment.ge...
  • IceDream_hong
  • IceDream_hong
  • 2014年02月13日 16:28
  • 2250

Android读取联系人的姓名及电话号码

Android中联系人的信息是通过ContentProvider来供外部应用获取的,我们使用时只需根据系统联系人ContentProvider的Uri即可获取所需数据。下面讲解如何获取联系人的姓名及电...
  • lb377463323
  • lb377463323
  • 2017年05月09日 16:34
  • 2440

Android项目实战-获取手机本地联系人,并带字母导航栏

因项目需要,有重新写了一个获取手机联系人模块,再此记录一下,看效果图: 如图中所示,我们本篇文章要实现的有: 1、自定义view——–字母索引列表view 2、listview数据的展示 ...
  • ali18510953445
  • ali18510953445
  • 2018年01月19日 11:58
  • 69

android 使用内容提供者获取手机联系人

最近在学习安卓的相关内容, 正好在写获取手机联系人的程序, 就想到了内容提供者, 这里有几点需要注意, 写到这里, 以后方便自己查询。 1. 手机联系人的数据库是存储在 data/data/com....
  • zhyh1435589631
  • zhyh1435589631
  • 2016年02月16日 10:17
  • 1520

Swift 获取联系人信息

Swift 获取联系人信息如今很多开发者都开始尝试使用Swift进行开发,而且获取手机通讯录作为开发常见的需求 作为一个新的开发者,如果我们开发的应用需求不是特别高,只要求是iOS9以上, 那么恭...
  • spicyShrimp
  • spicyShrimp
  • 2017年04月25日 15:14
  • 568

ContentResolver实现获取手机联系人并显示在ListView中

1.首先知道联系人的uri: 联系人 content://com.android.contacts/raw_contacts(获得联系人的id,姓名) content://com.android...
  • qq_37465836
  • qq_37465836
  • 2017年02月21日 18:25
  • 280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-屏幕滑动和获取手机联系人
举报原因:
原因补充:

(最多只允许输入30个字)