手机卫士高级工具模块.doc_第1页
手机卫士高级工具模块.doc_第2页
手机卫士高级工具模块.doc_第3页
手机卫士高级工具模块.doc_第4页
手机卫士高级工具模块.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android手机卫士学习笔记 就业服务部出品第4章 高级工具模块在功能列表中点击高级工具,就进入了我们的高级工具界面,该模块主要有号码归属地查询、短信备份、常用号码查询、程序锁等功能。4.1 高级工具主界面1. 高级工具主界面效果图高级工具界面的效果图如下所示。 从上图可以看出,高级工具主要包含了四个条目。高级工具的布局文件代码如下所示。 4.2 短信备份要实现短信备份,首先要获取到系统的短信,然后将短信内容保存到本地文件中。这里我们使用一个xml文件来保存系统短信。因此需要在清单文件中配置相应的权限,具体代码如下所示:实现短信备份的功能代码如下所示。/* * 操作短信数据库的工具类 * * author Kevin * */public class SmsUtils /* * 短信备份 * param mProgress */public static void smsBackup(Context ctx, File output, SmsCallback callback) Cursor cursor = ctx.getContentResolver().query(Uri.parse(content:/sms/),new String address, date, type, body , null, null,null);/ mProgress.setMax(cursor.getCount();/ 将短信总数设定为进度条最大值callback.preSmsBackup(cursor.getCount();/ 准备备份int progress = 0;XmlSerializer serializer = Xml.newSerializer();try serializer.setOutput(new FileOutputStream(output), utf-8);serializer.startDocument(utf-8, null);/ 参2传null表示xml文件头不带standalone标签serializer.startTag(null, smss);/ 起始标签while (cursor.moveToNext() serializer.startTag(null, sms);/ 获取短信号码serializer.startTag(null, address);String address = cursor.getString(cursor.getColumnIndex(address);serializer.text(address);serializer.endTag(null, address);/ 获取短信时间serializer.startTag(null, date);String date = cursor.getString(cursor.getColumnIndex(date);serializer.text(date);serializer.endTag(null, date);/ 短信类型serializer.startTag(null, type);String type = cursor.getString(cursor.getColumnIndex(type);serializer.text(type);serializer.endTag(null, type);/ 短信内容serializer.startTag(null, body);String body = cursor.getString(cursor.getColumnIndex(body);serializer.text(body);serializer.endTag(null, body);serializer.endTag(null, sms);Thread.sleep(500);/ 模拟耗时情况progress+;/ mProgress.setProgress(progress);/ 更新进度callback.onSmsBackup(progress);/ 更新进度serializer.endTag(null, smss);/ 结束标签serializer.endDocument();cursor.close(); catch (Exception e) e.printStackTrace();/* * 短信回调接口 * * author Kevin * */public interface SmsCallback /* * 短信准备备份 * * param total * 短信总数量 */public void preSmsBackup(int total);/* * 正在备份 * * param progress * 备份进度 */public void onSmsBackup(int progress);上述代码使用到了接口回调方法,这里的回调方法主要是用于监听短信备份的进度的。短信备份是一个耗时的过程,为了让用户体验更好,一般都在界面上显示备份的进度,这时就需要知道短信备份的进度。4.3 AtoolsActivity逻辑代码()AtoolsActivity的代码清单如下所示。/* * 高级工具 * * author Kevin * */public class AToolsActivity extends Activity private ProgressDialog mProgress;private ProgressBar pbProgress;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_atools);pbProgress = (ProgressBar) findViewById(R.id.pb_progress);/* * 软件锁 * * param view */public void appLock(View view) startActivity(new Intent(this, AppLockActivity.class);/* * 常用号码查询 * * param view */public void commonNumberQuery(View view) startActivity(new Intent(this, CommonNumberActivity.class);/* * 查询地址 */public void addressQuery(View view) startActivity(new Intent(this, AddressQueryActivity.class);/* * 备份短信 */public void smsBackup(View view) if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) mProgress = new ProgressDialog(this);/ 可以在子线程更新mProgress.setMessage(正在备份短信,请稍候.);mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);/ 水平方向的进度条,/ 有进度展示mProgress.show();new Thread() public void run() / 备份短信文件的本地路径String path = Environment.getExternalStorageDirectory().getAbsolutePath() + /sms55.xml;File file = new File(path);SmsUtils.smsBackup(AToolsActivity.this, file,new SmsCallback() Overridepublic void preSmsBackup(int total) mProgress.setMax(total);/ pbProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);/ pbProgress.setProgress(progress););mProgress.dismiss();.start(); else ToastUtils.showToast(this, 没有找到sdcard!);class MyCallback implements SmsCallback Overridepublic void preSmsBackup(int total) mProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);mProgress.setProgress(progress);/ pbProgress.setProgress(progress););mProgress.dismiss();.start(); else ToastUtils.showToast(this, 没有找到sdcard!);class MyCallback implements SmsCallback Overridepublic void preSmsBackup(int total) mProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);class MyCallback implements SmsCallback Overridepublic void preSmsBackup(int total) mProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress); */public void addressQuery(View view) startActivity(new Intent(this, AddressQueryActivity.class);/* * 备份短信 */public void smsBackup(View view) if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) mProgress = new ProgressDialog(this);/ 可以在子线程更新mProgress.setMessage(正在备份短信,请稍候.);mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);/ 水平方向的进度条,/ 有进度展示mProgress.show();new Thread() public void run() / 备份短信文件的本地路径String path = Environment.getExternalStorageDirectory().getAbsolutePath() + /sms55.xml;File file = new File(path);SmsUtils.smsBackup(AToolsActivity.this, file,new SmsCallback() Overridepublic void preSmsBackup(int total) mProgress.setMax(total);/ pbProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);/ pbProgress.setProgress(progress););mProgress.dismiss();.start(); else ToastUtils.showToast(this, 没有找到sdcard!);class MyCallback implements SmsCallback Overridepublic void preSmsBackup(int total) mProgress.setMax(total);Overridepublic void onSmsBackup(int progress) mProgress.setProgress(progress);4.4 号码归属地查询()实现号码归属地查询有多种方法,比如联网查询,通过可以调用互联网服务,还有就是将常用的电话号码前缀存放在数据库库,然后将该数据库保存在本地。在我们的文档中我们只演示如何从数据库中进行归属地的查询。为了演示,我们提供了一个手机号码号码归属地数据库address.db。用SQLite Expert Professional工具打开该数据库,截图如下。该数据库有两张表,data1和data2,其中data1保存的是电话号码前缀和归属地编号。data2保存的是地区信息和归属地编号。将address.db放到工程目录中的assets目录下。在SplashActivity类中,我们将该资源拷贝到/data/data/com.itheima.mobileSafe/files/address.db中。拷贝数据库的代码清单如下所示。private void copyDB(String name) InputStream inputStream = null;FileOutputStream outputStream = null;try inputStream = getAssets().open(name);File file = new File(getFilesDir(), name);if (file.exists() Toast.makeText(this, 数据已经初始化完成, Toast.LENGTH_SHORT).show();return;outputStream = new FileOutputStream(file);int len = -1;byte buff = new byte1024;while(len=inputStream.read(buff)!=-1)outputStream.write(buff, 0, len);inputStream.close();outputStream.close(); catch (IOException e) e.printStackTrace();finallyif (inputStream!=null) try inputStream.close(); catch (IOException e) e.printStackTrace();if (outputStream!=null) try outputStream.close(); catch (IOException e) e.printStackTrace();在com.itheima.mobileSafe.db.dao包(如果没有该包则创建)下创建AddressQueryDao类,我们在该类中实现对数据库的操作。代码清单如下:public class AddressQueryDao private static String path = /data/data/com.itheima.mobileSafe/files/address.db;public static String queryAddress(String number) if (number.length()=7) query(null);else tv_addressResult.setText();Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) Overridepublic void afterTextChanged(Editable s) );/执行查询方法public void query(View view) String phone = et_phoneNumber.getText().toString();if (TextUtils.isEmpty(phone) Toast.makeText(this, 号码不能为空, Toast.LENGTH_SHORT).show();/如果号码为空,则抖动编辑框,抖动效果是在xml文件中定义的Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); et_phoneNumber.startAnimation(shake); vibrator.vibrate(2000);return; else if (phone.length() 7) Toast.makeText(this, 号码至少为7位, Toast.LENGTH_SHORT).show();Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); et_phoneNumber.startAnimation(shake);return;String reg = 1345678d5,9$;if (!phone.matches(reg) Toast.makeText(this, 输入的电话号码不合法。, Toast.LENGTH_SHORT).show();Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); et_phoneNumber.startAnimation(shake);return;String address = AddressQueryDao.queryAddress(phone);Message msg = new Message();msg.what = RESULT_OK;if (TextUtils.isEmpty(address) msg.obj = 对不起,没有查询到该号码; else msg.obj = address;handler.sendMessage(msg);在上面代码中当用户没有输入任何内容却要查询号码时,我们给了用户抖动编辑框的提示。这个抖动效果主要是通过动画实现的。代码很简单,只有如下的两行。Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);et_phoneNumber.startAnimation(shake);我们需要在anim目录中创建shake.xml文件。文件目录结构如下图所示。shake.xml文件清单如下:上面的代码中用到了android:interpolator属性,该属性在这里代表当前动画执行的次数,cycle_7.xml文件清单如下:4.4.2 监听EditText监听EditText文字变化使用addTextChangedListener监听,具体如下所示。/ 监听EditText变化etNumber.addTextChangedListener(new TextWatcher() / 文本发生变化Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) / 文本发生变化之前Overridepublic void beforeT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论