本文为他人写的一个软件,感觉对初学者有一定参考意义,所以就顺便摘上来了:
先是说需要用到技术:
手机防盗软件:
运用到得知识点:
1.SharedPreference
用于保存用户的设置信息
是否开启了防盗的功能
保存安全号码
保存用户当前SIM卡的信息
2.BroadcastReceuver
实现开机检测
检测接收短信
3.TelephonyManager
获取SIM卡的信息
4.SmsManager
发送短信
总结:
1.关于SharedPreference:
在android平台下用于保存数据有三种方式:1.SQLite 2.SharedPreferences 3.File SharedPreferences是将数据保存在一个XML文件中
, 并且是以Map的形式保存,一个Key对应一个Value,但获取某一个Key的是否,都会有一个默认值,这个默认值是在xml不存在这个key值的是
否使用,
a) 获得SharedPreferences: 获得SharedPreferences是通过上下文(Context)中的getSharedPreferences方法获得:SharedPreferences
sp = this.getSharedPreferences("data",MODE_WORLD_READABLE);第一个参数是指定xml文件的名字,当不存在的是否会创建它,第二个参
数是获得这个SharedPreferences的模式,一共有四种模式:MODE_APPEND MODE_PRIVATE MODE_WORLD_READABLE MODE_wORLD_WRITEABLE
b) 从SharedPreferneces中取值: 通过sp.getXXX的方式可以获得对应key的值,在getXXX的时候,需要指定一个默认的值,当key值不存在
的时候使用
c) 往SharedPreferences中设置:
需要用到Editro: Editor editor = sp.edit();获得了Editor之后,才能对SharedPreferences进行写:editro.putXXX
("key",value);最后需要注意的一点是别忘了commit();
e) Xml文件存放的位置位于data/data/包名/shared_prefs/xxx.xml
2.关于AlertDialog: 创建AlertDialog需要用到AlertDialog.Builder这个对象,对这个Builder做相应的设置.可以使用AlertDialog有不
同的展现: AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("");
a) 创建普通的AlertDialog:builder.setNegativeButton("xxx",new DialogInterface.OnClickListener(){public void onClick
(DialogInterface dialog,int which){...}});一共有三种Button;NegativeButton,PositiveButton,NeutralButton:这三种Button默认
的实现了点击之后消失AlertDialog
b) 创建自定义布局的AlertDialog:需要一个布局文件,我们所需要做的就是将这个布局文件编程一个view对象,再将这个View对象设置
到Builder里面去,将布局文件变成一个View对象,需要用到LayoutInflater这个对象中的inflate方法,LayoutInflater.infalter =
LayoutInflater.from(this);View view = inflater.inflate(R.layout.showpassworddailog,null);之后再builder.setView(view)就可
以将自定义的布局文件放到Dialog里面去了,在这个自定义的布局文件中,我们也是可以取到里面定义的控件,通过view.findViewById()就
可以找到自定义布局文件中的相应控件,之后就可以设置或者做事件的监听:
AlertDialog dialog = builder.create();
dialog.show();
广播接收者,对接收短信进行监听,当手机接收到一条短信的时候,系统会发出一条广播,被广播接收者接收,别忘了要将这个广播接收者进
行注册,在onReceive方法中有一个参数intent,当拦截这条短信的时候,所有的短信信息都会封装在这个intent中,我们可以通过这个
Intent来获取短信信息
短信封装的形式:pdu
Object[] obj = (Object[])intent.getSerializableExtra("pdus");
一条短信就是一个SmsMessage对象,一个SmsMessage对象通过一个byte[]来创建,一个byte[]数组就是一个object对象.
Object[]
Object[0]: 存在的形式 byte[] 一条短信
Object[1]:
Object[2]:
Object[3]:
所以Object[] 对应着一个byte[][]的二维数组
byte[][] pdus = new byte[object.length][];
pdus[i] = (byte[])object[i];
SmsMessage message = SmsMessage.createFromPdu(pdus[i]);
获得来短信号码:
String oriAddress = msgs[i].getDisplayOriginatingAddress();
获得来短信的内容:
String body = msgs[i].getDisplayMessageBody();
完善:
将接收短信和发送短信改成后台操作,不在机子上有相关的显示
通过gps,发送的短信内容包含位置信息
源码:
package com.jsd.lostprevent;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
*
* @author jiangshide
*
*/
public class LostPreventJsd extends Activity {
AlertDialog setPrasswordDialog;
AlertDialog showLoginDialog;
SharedPreferences sp;
EditText et_safenumber;
Button btn_start,btn_modify;
boolean isFirst;
boolean isStart;
TelephonyManager tm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
sp = this.getSharedPreferences("data", MODE_WORLD_READABLE);
isFirst = sp.getBoolean("first", true);
if(isFirst){
showPasswordDialog();
return;
}else{
showLoginDailog();//进入登陆对话框
}
}
private void showLoginDailog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.showpassworddialog, null);
final EditText et_userName = (EditText)view.findViewById(R.id.userName);
final EditText et_password = (EditText)view.findViewById(R.id.password);
Button btn_ok = (Button)view.findViewById(R.id.ok);
Button btn_cancel = (Button)view.findViewById(R.id.cancel);
btn_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String userName = et_userName.getText().toString();
String password = et_password.getText().toString();
if(userName.trim().equals("") || password.trim().equals("")){
Toast.makeText(LostPreventJsd.this, "用户或者密码不能为空!", 1).show();
return;
}
String savedUserName = sp.getString("userName", "");
String savedPassword = sp.getString("password", "");
if(userName.trim().equals(savedUserName) && password.trim().equals(savedPassword)){
init();
showLoginDialog.dismiss();
}else{
Toast.makeText(LostPreventJsd.this, "用户名或者密码错误!", 1).show();
return;
}
}
});
btn_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
builder.setTitle("请输入密码");
builder.setView(view);
showLoginDialog = builder.create();
showLoginDialog.show();
}
/**
* show main page
*/
private void init(){
setContentView(R.layout.main);
et_safenumber = (EditText) this.findViewById(R.id.safenumber);
btn_start = (Button) this.findViewById(R.id.start);
btn_modify = (Button) this.findViewById(R.id.modify);
String savedNumber = sp.getString("safenumber", "");
et_safenumber.setText(savedNumber);//保存NUMBER
//当用户进入的时候,如果已经是开启防盗了的,这是我们需要把开启防盗与修改设为不可用,当用户为关闭防盗功能的时候,这是我们需要把开启防盗与修改密码的按钮设为可用
//需要使用SharedPreference,并通过一个boolean来进行判断
isStart = sp.getBoolean("start", false);
if(isStart){
et_safenumber.setEnabled(false);
btn_modify.setEnabled(false);
btn_start.setText("停止防盗");
}
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isStart){
Editor editor = sp.edit();
editor.putBoolean("start", false);
editor.commit();
et_safenumber.setEnabled(true);
btn_modify.setEnabled(true);
btn_start.setText("开始防盗");
isStart = false;
}else{
String safeNumber = et_safenumber.getText().toString();
if(safeNumber.trim().equals("")){
Toast.makeText(LostPreventJsd.this, "安全号码不能为空!请重新设置", 1).show();
return;
}else{
String phoneNumber = tm.getLine1Number();//大多数情况下为null值,因为真实的电话号码并没有写入到SIM卡中
String subScriberId = tm.getSubscriberId();//用来区分每一张卡的唯一的标识:IMSI,注意:当手机开机时并不会将其电话号码保存进卡,而是IMSI只是一个码值用来区分卡
//当手机开机时就会发送一个IMSI码给手机运营商,然后运营商将其你的手机号码从数据库中查出来,然后再返回到你的手机,这样就获得了你的真实手机号码
Editor editor = sp.edit();
editor.putString("safenumber", safeNumber);
isStart = true;
editor.putBoolean("start", isStart);
editor.putString("subscriberid", subScriberId);
editor.commit();
btn_modify.setEnabled(false);
et_safenumber.setEnabled(false);
btn_start.setText("停止防盗");
}
}
}
});
btn_modify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showPasswordDialog();//修改密码
}
});
}
private void showPasswordDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);//这是一个VIEW渲染器:将一个XML文件渲染成一个对象
View view = inflater.inflate(R.layout.showpassworddialog, null);//返回一个VIEW对象
final EditText et_userName = (EditText) view.findViewById(R.id.userName);
final EditText et_password = (EditText) view.findViewById(R.id.password);
Button btn_ok = (Button)view.findViewById(R.id.ok);
Button btn_cancel = (Button)view.findViewById(R.id.cancel);
btn_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String userName = et_userName.getText().toString();
String password = et_password.getText().toString();
if(userName.trim().equals("") || password.trim().equals("")){
Toast.makeText(LostPreventJsd.this, "用户或者密码不能为空", 1).show();
return;
}
Editor editor = sp.edit();//获得编辑器
editor.putString("userName", userName);
editor.putString("password", password);
editor.putBoolean("first", false);//重新设置密码后不需要弹出
editor.commit();
setPrasswordDialog.dismiss();
init();//在这里由于被设置为false就不会弹出对话框了
}
});
btn_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isFirst){
finish();
}else{
setPrasswordDialog.dismiss();
}
}
});
builder.setTitle("设置密码");
builder.setView(view);//把VIEW文件设置进去
setPrasswordDialog = builder.create();//返回一个Dialog对其初始化
setPrasswordDialog.show();
}
}
package com.jsd.lostprevent;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
/**
* 处理开机启动完成时对某些数据的处理方式
* @author jiangshide
*
*/
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_WORLD_WRITEABLE);
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
boolean isStart = sp.getBoolean("start", false);
if(!isStart){
return;
}else{
String saveSubScriberId = sp.getString("subscriberid", "");
String safenumber = sp.getString("safenumber", "");
String subScriberId = tm.getSubscriberId();
if(subScriberId.trim().equals(saveSubScriberId)){
return;
}else{
SmsManager sm = SmsManager.getDefault();
List<String> message = sm.divideMessage("手机IMSI码为:" + saveSubScriberId + "的手机,SIM卡已更换,更换的IMSI码为:" + subScriberId);
for(String msg : message){
sm.sendTextMessage(safenumber, null, msg, null, null);//当很长的字符串时可以按多次进行发送
}
}
}
}
}