A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【济南中心】Android课程同步笔记day03:Android应用之安全卫士

今天主要是手机防盗设置向导页面的搭建,总结下今天所用到的技能点
shape画小圆点
[XML] 纯文本查看 复制代码
选中的时候point_select.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <corners android:radius="8dp" />
    <solid android:color="#A9D417" />
</shape>
[XML] 纯文本查看 复制代码
未选中的时候point_normal.xml:[/size]
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <corners android:radius="8dp" />
    <solid android:color="#44000000" />
</shape>
界面切换动画
5 个向导界面之间进行切换的时候,界面都是一闪而过的,为了让界面的过渡效果更加好看,这里在不同界面之间的切换中加入过渡动画的效果,即界面是慢慢滑过去的。
为了更好的分析下一步和上一步切换界面时不同的过渡平移动画,这里画出了一张当前页、上一页、下一页的演示图,如下图所示

分析可知:当点击下一步时,当前页在x 轴从0 到-100%p,下一页从100%p 到0;点击上一步时,当前页从0 到100%p,上一页从-100%p 到0,我们在res 目录下新建一个名为anim 的目录,将代码放到目录下。
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<!--界面的进入动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="100%p"
    android:toXDelta="0" >
</translate>

[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<!—界面的移除动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0"
    android:toXDelta="-100%p" >
</translate>

动画效果已经创建完成增加以下代码即可实现过渡动画的效果
overridePendingTransition(进入动画,退出动画);

抽取父类
由于我们需要在五个向导界面中都要书写下一步和上一步的跳转逻辑和过渡动画,因此,这里考虑提取一个父类BaseSetUpActivity,让这五个向导界面继承BaseSetUpActivity,这样就会使代码更加简洁,将共性代码抽到基类里面,不确定的代码做成抽象方法。
[Java] 纯文本查看 复制代码
public abstract class BaseSetupActivity extends Activity {
        /**
         * 跳转到上一个界面
         */
        public void clickPre(View view) {
                // Intent intent = new Intent(this, SetupActivity1.class);
                // startActivity(intent);
                performPre();
                // 设置过渡动画
                int enterAnim = R.anim.pre_enter;// 进入的activity对应的动画资源
                int exitAnim = R.anim.pre_exit;// 结束的activity对应的动画资源
                overridePendingTransition(enterAnim, exitAnim);
                // 结束页面
                finish();
        }
        /**
         * 跳转到下一个界面
         */
        public void clickNext(View view) {
                // Intent intent = new Intent(this, SetupActivity2.class);
                // startActivity(intent);
                performNext();
                // 设置过渡动画
                int enterAnim = R.anim.next_enter;// 进入的activity对应的动画资源
                int exitAnim = R.anim.next_exit;// 结束的activity对应的动画资源
                overridePendingTransition(enterAnim, exitAnim);
                finish();
        }
        /**
         * 上一步的操作
         */
        protected abstract void performPre();
        /**
         * 下一步的操作
         */
        protected abstract void performNext();
}

手势识别器
为了提高用户体验,这里将使用手势识别来进行下一步和上一步的跳转;由于五个设置向导界面都需要手势滑动所以这里我们完全可以方便的只在BaseSetupActivity中实现手势的操作。
[Java] 纯文本查看 复制代码
        // 1.新建手势失败器
                mDetector = new GestureDetector(this, new SimpleOnGestureListener() {
                        // 2.实现对应监听中关心操作
                        // 触摸滑动的回调
                        @Override
                        public boolean onFling(MotionEvent e1, MotionEvent e2,
                                        float velocityX, float velocityY) {
                                // e1:手势开始时的点
                                // e2:手势结束时的点
                                // velocityX :水平方向的速率
                                // velocityY :垂直方向的速率
                                float x1 = e1.getRawX();
                                float x2 = e2.getRawX();
                                float y1 = e1.getRawY();
                                float y2 = e2.getRawY();
                                if (Math.abs(velocityX) < 200) {
                                        Log.d(TAG, "水平速率: " + velocityX);
                                        return true;
                                }
                                // 垂直方向的判断
                                if (Math.abs(y2 - y1) > Math.abs(x2 - x1)) {
                                        // Y轴运动
                                        Log.d(TAG, "Y轴运动");
                                        return true;
                                }
                                if (x1 > x2) {
                                        // 如果从右向左滑动,下一步的操作
                                        Log.d(TAG, "手势执行下一步的操作");
                                        doNext();
                                } else {
                                        // 如果从左向右滑动,上一步的操作
                                        Log.d(TAG, "手势执行上一步的操作");
                                        doPre();
                                }
                                return super.onFling(e1, e2, velocityX, velocityY);
                        }
                });

我们还需要手势识别器去捕获分析touch行为所以在onTouchEvent方法里面设置mDetector.onTouchEvent(event)将touch行为交给收拾识别器去处理。

SIM卡的绑定
SIM卡绑定其实就是获取SIM卡信息并保存,如果手机被插入了其他的Sim 卡,检测到Sim 卡发生了变化,系统会发送报警短信。
[Java] 纯文本查看 复制代码
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
sim = tm.getSimSerialNumber();
// 记录sim卡信息
PreferenceUtils.setString(this, Config.KEY_SJFD_SIM, sim);
还需要加入读取手机Sim 卡的权限
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />

设置安全号码在读取用户联系人信息时,需要一定的权限
<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
[Java] 纯文本查看 复制代码
public class ContactProvider {
        /**
         * 获取系统所有联系人
         * @param context
         * @return List<ContactBean>
         */
        public static List<ContactBean> getAllContacts(Context context) {
                List<ContactBean> list = new ArrayList<ContactBean>();
                // 数据查询--》系统的联系人
                ContentResolver cr = context.getContentResolver();
                // 通过号码查询
                Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;// 要查询数据对应的uri地址
                String[] projection = new String[] {
                                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,// 名称
                                ContactsContract.CommonDataKinds.Phone.NUMBER,// 号码
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID // 联系人的id
                };// 要查询的列
                String selection = null;// 查询的条件
                String[] selectionArgs = null;// 查询条件对应的参数
                String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " desc";// 查询的排序
                Cursor cursor = cr.query(uri, projection, selection, selectionArgs,
                                sortOrder);
                if (cursor != null) {
                        while (cursor.moveToNext()) {
                                String name = cursor.getString(0);
                                String number = cursor.getString(1);
                                long contactId = cursor.getLong(2);
                                ContactBean bean = new ContactBean();
                                bean.name = name;
                                bean.number = number;
                                bean.contactId = contactId;
                                list.add(bean);
                        }
                        cursor.close();
                }
                return list;
        }
        
        /**
         * 得到联系人的头像
         * @param context:上下文
         * @param contactId:联系人id
         * @return:bitmap头像
         */
        public static Bitmap getContactPhoto(Context context, long contactId) {
                ContentResolver cr = context.getContentResolver();
                // content://contacts //所有联系人
                // content://contacts/1 //具体联系人
                // ContactsContract.Contacts.CONTENT_URI;//所有联系人的uri
                Uri contactUri = Uri.withAppendedPath(
                                ContactsContract.Contacts.CONTENT_URI,
                                String.valueOf(contactId));
                InputStream stream = ContactsContract.Contacts
                                .openContactPhotoInputStream(cr, contactUri);
                // 将流转换为bitmap
                return BitmapFactory.decodeStream(stream);
        }
}
这里,用于存储用户联系人信息的JavaBean 是ContactInfo.java,如下所示。
public class ContactBean {
        public String name;
        public String number;
        public long contactId;// 联系人id,用于图片的查询
}



15 个回复

倒序浏览

回帖奖励 +1 黑马币

不错不错
回复 使用道具 举报

回帖奖励 +1 黑马币

楼上的怎么像打广告的?
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

谢谢资料 支持
回复 使用道具 举报

回帖奖励 +1 黑马币

谢谢分享 赞赞赞!!!!!!
回复 使用道具 举报

回帖奖励 +1 黑马币

好东西!谢谢分享!谢谢!!!
回复 使用道具 举报
wh121 中级黑马 2017-3-24 15:33:43
7#

回帖奖励 +1 黑马币

进来学习看看
回复 使用道具 举报

回帖奖励 +1 黑马币

不错不错
回复 使用道具 举报

回帖奖励 +1 黑马币

感谢老师分享, 辛苦了....
回复 使用道具 举报

回帖奖励 +1 黑马币

讲的挺详细的
回复 使用道具 举报
dhj 中级黑马 2017-6-9 11:43:41
11#

回帖奖励 +1 黑马币

感谢分享,辛苦!!
回复 使用道具 举报

回帖奖励 +1 黑马币

可以的 很强势
回复 使用道具 举报

回帖奖励 +1 黑马币

辛苦了,多谢分享
回复 使用道具 举报
cheat 中级黑马 2017-7-10 22:51:36
14#

回帖奖励 +1 黑马币

全部东西都拿下
回复 使用道具 举报

回帖奖励 +1 黑马币

多谢分享
回复 使用道具 举报
baby14 金牌黑马 2018-11-11 11:11:20
16#

回帖奖励 +1 黑马币

多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马