1、【济南中心】Android 课程同步笔记day03:Android 应用之安全卫士今天主要是手机防盗设置向导页面的搭建,总结下今天所用到的技能点shape 画小圆点选中的时候 point_select.xml:未选中的时候 point_normal.xml:界面切换动画5 个向导界面之间进行切换的时候,界面都是一闪而过的,为了让界面的过渡效果更加好看,这里在不同界面之间的切换中加入过渡动画的效果,即界面是慢慢滑过去的。为了更好的分析下一步和上一步切换界面时不同的过渡平移动画,这里画出了一张当前页、上一页、下一页的演示图,如下图所示分析可知:当点击下一步时,当前页在 x 轴从 0 到-100%p
2、,下一页从100%p 到 0;点击上一步时,当前页从 0 到 100%p,上一页从-100%p 到0,我们在 res 目录下新建一个名为 anim 的目录,将代码放到目录下。动画效果已经创建完成增加以下代码即可实现过渡动画的效果overridePendingTransition(进入动画,退出动画);抽取父类由于我们需要在五个向导界面中都要书写下一步和上一步的跳转逻辑和过渡动画,因此,这里考虑提取一个父类 BaseSetUpActivity,让这五个向导界面继承 BaseSetUpActivity,这样就会使代码更加简洁,将共性代码抽到基类里面,不确定的代码做成抽象方法。public abst
3、ract 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 对应的动画资
4、源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;
5、/ 结束的 activity 对应的动画资源overridePendingTransition(enterAnim, exitAnim);finish();/* 上一步的操作*/protected abstract void performPre();/* 下一步的操作*/protected abstract void performNext();手势识别器为了提高用户体验,这里将使用手势识别来进行下一步和上一步的跳转;由于五个设置向导界面都需要手势滑动所以这里我们完全可以方便的只在BaseSetupActivity 中实现手势的操作。/ 1.新建手势失败器mDetector = new Ge
6、stureDetector(this, new SimpleOnGestureListener() / 2.实现对应监听中关心操作/ 触摸滑动的回调Overridepublic 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.getR
7、awY();float y2 = e2.getRawY();if (Math.abs(velocityX) 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););我们还需要手势识别器去捕获分析 to
8、uch 行为所以在 onTouchEvent 方法里面设置 mDetector.onTouchEvent(event)将 touch 行为交给收拾识别器去处理。SIM 卡的绑定SIM 卡绑定其实就是获取 SIM 卡信息并保存,如果手机被插入了其他的 Sim 卡,检测到 Sim 卡发生了变化,系统会发送报警短信。TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);sim = tm.getSimSerialNumber();/ 记录 sim 卡信息PreferenceUtils.s
9、etString(this, Config.KEY_SJFD_SIM, sim);还需要加入读取手机 Sim 卡的权限设置安全号码在读取用户联系人信息时,需要一定的权限public class ContactProvider /* 获取系统所有联系人* param context* return List*/public static List getAllContacts(Context context) List list = new ArrayList();/ 数据查询-系统的联系人ContentResolver cr = context.getContentResolver();/ 通
10、过号码查询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 select
11、ion = 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(
12、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 s
13、tatic Bitmap getContactPhoto(Context context, long contactId) ContentResolver cr = context.getContentResolver();/ content:/contacts /所有联系人/ content:/contacts/1 /具体联系人/ ContactsContract.Contacts.CONTENT_URI;/所有联系人的 uriUri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI,String.valueOf(contactId);InputStream stream = ContactsContract.Contacts.openContactPhotoInputStream(cr, contactUri);/ 将流转换为 bitmapreturn BitmapFactory.decodeStream(stream);