SMS機制收發短信
發送短信
發短信比較簡單,我們可以定義一個類,通過傳參(包括號碼與內容)的方式進行進一步操作。
import android.telephony.SmsManager;
import java.util.ArrayList;
public class SendMsg {
String message;
String phone;
public SendMsg(String message, String phone) {
this.message = message;
this.phone = phone;
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> list = smsManager.divideMessage(message);
for (String text:list) {
smsManager.sendTextMessage(phone, null, text, null, null);
}
}
}
在manifest清單文件中加入權限聲明:
<uses-permission android:name="android.permission.SEND_SMS" />
以上權限屬於危險權限,需要在程序運行時動態申請。在主MainActivity中加入運行權限:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 1);
}
}
//接着就是重寫onRequestPermissionsResult
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//這裏寫操作 如send(); send函數中New SendMsg (號碼,內容);
} else {
Toast.makeText(this, "你沒啓動權限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
接收短信
廣播需要創建一個Receiver進行監聽短信的查收。如下:
手機被盜應急措施
市面上流行了很多安全衛士軟件,它們在手機被盜之後,都擁有遠程操控手機的功能,如播放報警鈴聲、獲取手機位置、遠程鎖屏、恢復出廠設置等等,這次我們就來看看怎麼實現這些功能。
報警鈴聲的實現
說起所有的遠程操控的功能中,就屬於報警鈴聲最容易實現了,所以我們先實現這個。
首先建立一個Android project,然後建立一個SmsReceive廣播接收者,沒錯,就是這個,我們的目的就是使用廣播接收者接收到短信,然後通過解析短信的內容來遠程操控手機。
SmsReceive代碼:
public class SmsReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
那麼如何才能解析短信呢?這其實非常簡單,只要用以下幾行代碼就行了:
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for (Object obj : objs) {
// 獲得短信內容
SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj); // 此方法已過時
String smsbody = sms.getMessageBody();
String sender = sms.getOriginatingAddress();
System.out.println("發件人:" + sender + " 內容:" + smsbody);
}
我們將這段解析短信的代碼加入SmsReceive廣播接收者的onReceive()方法之中,這時我們就可以監聽到短信的信息了!
但是且慢,我們還必須在mainfest中註冊廣播接收者才能生效,要時刻牢記Android四大組件都是必須要註冊才能生效的。
<receiver android:name="com.example.controldevice.SmsReceive" >
<intent-filter android:priority="1000" >
<!-- 獲取短信接收事件 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
另外,接收短信是屬於用戶的隱私,所以還需要添加權限,如下:
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
OK,這時候我們就已經成功的監聽到了短信了,夠簡單吧!現在就打開模擬器嘗試着發一條短信看看有沒有輸出吧!
前期準備工作已經完成,那麼我們就來操控報警短信吧。在SmsReceive廣播接收者的onReceive()方法中添加以下代碼:
public void onReceive(Context context, Intent intent) {
Object[] objs = (Object[]) intent.getExtras().get("pdus");
······
System.out.println("發件人:" + sender + " 內容:" + smsbody);
if ("#*music*#".equals(smsbody)){
System.out.println("快點播放音樂");
// 播放音樂(需要在res目錄下的raw文件夾添加bestfriend的歌曲)
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend);
mediaPlayer.start();
}
}
}
}
妥妥的,現在當你發送"#music#到你的模擬器時,廣播接收者就會解析短信,然後播放報警鈴聲。
真的是很簡單的一個項目呀~~~哎,不要吐槽,我們只是先來一點簡單的東西但開胃菜,剩下的就稍微有些難度了。
遠程鎖屏與恢復出廠設置
響起報警鈴聲是如此的簡單,那麼擦除手機數據(恢復出廠設置)和遠程鎖屏呢?擦除手機信息和遠程鎖屏屬於手機的危險操作,所以一般情況下是無法使用手機應用直接使用這些功能的。
這些高危操作都屬於手機管理員的操作,所以我們必須要獲得手機的超級管理員權限才能夠操作。需要注意的是手機超級管理員與root是不同的,手機超級管理員指的是獲得手機最高的權限,而root則是獲得手機的所有權限。
如何獲得手機超級管理員權限呢?
手機超級管理員權限是在Android2.3的時候提出來的,它可以設置開屏密碼,禁用攝像頭,鎖屏等等,具體可以查看Android官網:https://developer.android.com/guide/topics/admin/device-admin.html
獲取超級管理員,首先要創建一個Admin類繼承自DeviceAdminReceiver,當然了,裏面可以重寫很多方法,但是我們現在先不理。代碼如下:
public class Admin extends DeviceAdminReceiver {
}
然後我們要在res資源目錄下創建一個xml目錄,在裏面創建device_admin_sample.xml。這個文件是用來說明開啓超級管理員後用戶所擁有的權限,代碼如下:
<device-admin
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
</uses-policies>
</device-admin>
在manifest中註冊DeviceAdminReceiver,添加代碼如下:
<receiver
android:name="com.example.controldevice.Admin"
android:description="@string/sample_device_admin_description"
android:label="@string/sample_device_admin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
前置工作已經完成了,我們就來正式獲取管理員權限吧。我們在MainActivity中添加兩個按鈕,一個register按鈕,點擊打開激活超級管理員權限,另一個unregister按鈕,點擊取消激活超級管理員權限。
要注意的是如果激活了超級管理員權限,那麼以後是不能夠直接卸載這個app的,必須要取消激活超級管理員權限之後才能正常卸載。
MainActivity代碼如下:
public class MainActivity extends Activity {
private DevicePolicyManager devicePolicyManager;
private ComponentName componentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
devicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
componentName = new ComponentName(this, Admin.class);
Button register = (Button) findViewById(R.id.register);
// Launch the activity to have the user enable our admin.
register.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
"激活超級管理員中");
startActivity(intent);
}
});
Button unregister = (Button) findViewById(R.id.unregister);
// 取消激活超級管理員
unregister.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (devicePolicyManager.isAdminActive(componentName)){
devicePolicyManager.removeActiveAdmin(componentName);
}
}
});
}
}
在這裏我們遇到兩個陌生的API,一個是DevicePolicyManager,這個是設備權限管理器,使用它才能夠管理鎖屏、擦出手機數據等等功能。另一個是ComponentName,它用於打開其他應用程序中的Activity或服務的,因爲啓動超級管理員權限是要啓動Android內置Activity才能激活的,所以需要使用ComponentName。
但我們點擊register按鈕的時候,app會直接打開另一個活動,不要慌,這是正常現象,點擊Activate激活即可激活超級管理員,界面如下:
當然了,這是用代碼的方法來激活超級管理員,你也可以直接在設置中激活,方法是:Settings-security-Device administrators-我們的app。要注意的是隻有繼承了DeviceAdminReceiver,以及在manifest註冊過之後纔會出現我們創建的app。
現在我們終於可以遠程擦除手機信息和遠程鎖屏了!回到我們的SmsReceive,繼續在onReceive()中添加代碼:
public class SmsReceive extends BroadcastReceiver {
private DevicePolicyManager mDevicePolicyManager;
private ComponentName mComponentName;
@Override
public void onReceive(Context context, Intent intent) {
mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
mComponentName = new ComponentName(context, Admin.class);
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for (Object obj : objs) {
// 獲得短信內容
SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
String smsbody = sms.getMessageBody();
String sender = sms.getOriginatingAddress();
System.out.println("發件人:" + sender + " 內容:" + smsbody);
if ("#*music*#".equals(smsbody)){
// 播放音樂
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend);
mediaPlayer.start();
} else if ("#*wipedata*#".equals(smsbody)){
// 擦出手機數據
if(mDevicePolicyManager.isAdminActive(mComponentName)) {
mDevicePolicyManager.wipeData(0);
}
} else if ("#*lock*#".equals(smsbody)){
// 鎖屏
if (mDevicePolicyManager.isAdminActive(mComponentName)){
mDevicePolicyManager.lockNow();
}
}
}
}
}
這時候你發送短信#wipedata#或者#lock#就能實現遠程擦除數據和鎖屏了。不過需要提示的是擦出數據在模擬器中不太好用,有可能會導致模擬器卡死,還有小心在真機測試,這可真是會恢復出廠設置的。