【济南中心】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,用于图片的查询
}
|