手機安全衛士——手機防盜頁面

来源:http://www.cnblogs.com/mengxiao/archive/2017/02/06/6371322.html
-Advertisement-
Play Games

LostFindActivity.java 下邊是設置嚮導: BaseSetupActivity.java Setup1Activity.java styles.xml btn_green_selector.xml //狀態選擇器(selector)設置給view,點擊會有相應的效果 .9.png( ...


LostFindActivity.java

public class LostFindActivity extends Activity {
    private SharedPreferences mPrefs;

    private TextView tvSafePhone;
    private ImageView ivProtect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPrefs = getSharedPreferences("config", MODE_PRIVATE);

        boolean configed = mPrefs.getBoolean("configed", false);// 判斷是否進入過設置嚮導
        if (configed) {
            setContentView(R.layout.activity_lost_find);

            // 根據sp更新安全號碼
            tvSafePhone = (TextView) findViewById(R.id.tv_safe_phone);
            String phone = mPrefs.getString("safe_phone", "");
            tvSafePhone.setText(phone);

            // 根據sp更新保護鎖
            ivProtect = (ImageView) findViewById(R.id.iv_protect);
            boolean protect = mPrefs.getBoolean("protect", false);
            if (protect) {
                ivProtect.setImageResource(R.drawable.lock);
            } else {
                ivProtect.setImageResource(R.drawable.unlock);
            }

        } else {
            // 跳轉設置嚮導頁
            startActivity(new Intent(this, Setup1Activity.class));
            finish();
        }
    }

    /**
     * 重新進入設置嚮導
     * 
     * @param view
     */
    public void reEnter(View view) {
        startActivity(new Intent(this, Setup1Activity.class));
        finish();
    }
}
activity_lost_find.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        style="@style/TitleStyle"
        android:text="手機防盜" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:gravity="center_vertical" >

        <TextView
            style="@style/ContentStyle"
            android:text="安全號碼" />

        <TextView
            android:id="@+id/tv_safe_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            
            android:textColor="@color/black"
            android:textSize="16sp" />
    </RelativeLayout>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/listview_divider" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:gravity="center_vertical" >

        <TextView
            style="@style/ContentStyle"
            android:text="防盜保護是否開啟" />

        <ImageView
            android:id="@+id/iv_protect"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/unlock" />
    </RelativeLayout>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/listview_divider" />

    <TextView
        android:layout_width="match_parent"
        android:background="@drawable/shape_selector"
        android:onClick="reEnter"
        android:clickable="true"
        style="@style/ContentStyle"
        android:layout_margin="5dp"
        android:text="重新進入設置嚮導" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/listview_divider" />
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="功能簡介"
        android:layout_margin="5dp"
        android:textColor="@color/black"
        android:textSize="18sp"
        android:background="#5000"
        />
    
    <TextView 
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/star_big_on"
        android:gravity="center"
        android:text="GPS追蹤:#*location*#"
        />
    <TextView 
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/star_big_on"
        android:gravity="center"
        android:text="播放報警音樂:#*alarm*#"
        />
    <TextView 
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/star_big_on"
        android:gravity="center"
        android:text="遠程刪除數據:#*wipedata*#"
        />
    <TextView 
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/star_big_on"
        android:gravity="center"
        android:text="遠程鎖屏:#*lockscreen*#"
        />
    

</LinearLayout>
shape_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/gradient_box" android:state_pressed="true"></item>
    
    <item android:drawable="@android:color/transparent"></item><!--預設  -->

</selector>
gradient_box.xml   
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >//矩形
    <!-- 漸變顏色 -->
    <gradient
        android:angle="45"
        android:centerColor="#fff"
        android:endColor="#f00"
        android:startColor="#0f0" >
    </gradient>

    <padding
        android:bottom="7dp"
        android:left="7dp"
        android:right="7dp"
        android:top="7dp" >
    </padding>
    <!-- 角度 -->
    <corners android:radius="5dp" />

</shape>

 

下邊是設置嚮導:

 

BaseSetupActivity.java

//不需要在清單文件中註冊,因為不需要界面展示
public
abstract class BaseSetupActivity extends Activity { private GestureDetector mDectector; public SharedPreferences mPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPref = getSharedPreferences("config", MODE_PRIVATE); // 手勢識別器 mDectector = new GestureDetector(this, new SimpleOnGestureListener() { /** * 監聽手勢滑動事件 e1表示滑動的起點,e2表示滑動終點 velocityX表示水平速度 velocityY表示垂直速度 */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 判斷縱向滑動幅度是否過大, 過大的話不允許切換界面 if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) { Toast.makeText(BaseSetupActivity.this, "不能這樣劃哦!", Toast.LENGTH_SHORT).show(); return true; } // 判斷滑動是否過慢 if (Math.abs(velocityX) < 100) { Toast.makeText(BaseSetupActivity.this, "滑動的太慢了!", Toast.LENGTH_SHORT).show(); return true; } // 向右劃,上一頁 if (e2.getRawX() - e1.getRawX() > 200) { showPreviousPage(); return true; } // 向左劃, 下一頁 if (e1.getRawX() - e2.getRawX() > 200) { showNextPage(); return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); } /** * 展示下一頁, 子類必須實現 */ public abstract void showNextPage(); /** * 展示上一頁, 子類必須實現 */ public abstract void showPreviousPage();//手勢識別和點擊按鈕都會進入這裡 // 點擊下一頁按鈕 public void next(View view) { showNextPage(); } // 點擊上一頁按鈕 public void previous(View view) { showPreviousPage(); } @Override public boolean onTouchEvent(MotionEvent event) { mDectector.onTouchEvent(event);// 委托手勢識別器處理觸摸事件 return super.onTouchEvent(event); } }

Setup1Activity.java

public class Setup1Activity extends BaseSetupActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup1);
    }

    @Override
    public void showNextPage() {
        startActivity(new Intent(this, Setup2Activity.class));
        finish();

        // 兩個界面切換的動畫
        overridePendingTransition(R.anim.trans_in, R.anim.trans_out);// 進入動畫和退出動畫
    }

    @Override
    public void showPreviousPage() {

    }
}
activity_setup1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    >

    <TextView
        style="@style/TitleStyle"
        android:text="1.歡迎使用手機防盜" />

    <TextView
        style="@style/ContentStyle"
        android:text="您的手機防盜衛士:" />

    <TextView
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/btn_star"
        android:gravity="center"
        android:text="SIM卡變更報警" />

    <TextView
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/btn_star"
        android:gravity="center"
        android:text="GPS追蹤" />

    <TextView
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/btn_star"
        android:gravity="center"
        android:text="遠程銷毀數據" />

    <TextView
        style="@style/ContentStyle"
        android:drawableLeft="@android:drawable/btn_star"
        android:gravity="center"
        android:text="遠程鎖屏" />
    <LinearLayout      //這是那四個 小點
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        
        >
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/presence_online"
            />
         <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/presence_invisible"
            />
          <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/presence_invisible"
            />
           <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/presence_invisible"
            />    
    </LinearLayout> 
    <RelativeLayout 
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        >
        <ImageView 
            android:id="@+id/iv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/setup1"/>
        <Button 
            style="@style/NextStyle"
            />
    </RelativeLayout>
</LinearLayout>

styles.xml

<resources>
    <style name="ContentStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        
        <item name="android:textColor">@color/black</item>
        
        <item name="android:textSize">18sp</item>
        <item name="android:layout_margin">10dp</item>
    </style>
    
     <style name="NextStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_alignParentBottom">true</item>
        <item name="android:layout_alignParentRight">true</item>
        <item name="android:background">@drawable/btn_green_selector</item>
        <item name="android:drawableRight">@drawable/next</item>
        <item name="android:text">下一步</item>
        <item name = "android:onClick">next</item>
    </style>
    <style name="PreviousStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_alignParentBottom">true</item>
        <item name="android:layout_alignParentLeft">true</item>
        <item name="android:background">@drawable/btn_green_selector</item>  //將狀態選擇器設置給button
        <item name="android:drawableRight">@drawable/previous</item>
        <item name="android:text">上一步</item>
        <item name = "android:onClick">previous</item>
    </style>
</resources>

btn_green_selector.xml   //狀態選擇器(selector)設置給view,點擊會有相應的效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"   >
    <item android:drawable="@drawable/function_greenbutton_pressed" //.9.png
          android:state_pressed="true" //按下
        ></item>
    <item android:drawable="@drawable/function_greenbutton_pressed"//.9.png
          android:state_focused="true" //獲取焦點
        ></item>
    <item android:drawable="@drawable/btn_green_normal"></item> //預設
</selector>

 

.9.png(9patch)圖片的製作:

通過黑色邊線來描述圖片的拉伸情況和填充文字的方式

上邊線-水平拉伸;左邊線-垂直拉伸;右邊線-垂直填充區域;下邊線-水平填充區域

   

    

 

Setup2Activity.java

public class Setup2Activity extends BaseSetupActivity {
    
    private SettingItemView sivSim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup2);

        sivSim = (SettingItemView) findViewById(R.id.siv_sim);

        String sim = mPref.getString("sim", null);
        if (!TextUtils.isEmpty(sim)) {
            sivSim.setChecked(true);
        } else {
            sivSim.setChecked(false);
        }

        sivSim.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (sivSim.isChecked()) {
                    sivSim.setChecked(false);
                    mPref.edit().remove("sim").commit();// 刪除已綁定的sim卡
                } else {
                    sivSim.setChecked(true);
                    // 選中的話,保存sim卡信息
                    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                    String simSerialNumber = tm.getSimSerialNumber();// 獲取sim卡序列號
                    System.out.println("sim卡序列號:" + simSerialNumber);

                    mPref.edit().putString("sim", simSerialNumber).commit();// 將sim卡序列號保存在sp中
                }
            }
        });
    }

    @Override
    public void showNextPage() {
        // 如果sim卡沒有綁定,就不允許進入下一個頁面
        String sim = mPref.getString("sim", null);
        if (TextUtils.isEmpty(sim)) {
            ToastUtils.showToast(this, "必須綁定sim卡!");
            return;
        }

        startActivity(new Intent(this, Setup3Activity.class));
        finish();

        // 兩個界面切換的動畫
        overridePendingTransition(R.anim.trans_in, R.anim.trans_out);// 進入動畫和退出動畫
    }

    @Override
    public void showPreviousPage() {
        startActivity(new Intent(this, Setup1Activity.class));
        finish();

        // 兩個界面切換的動畫
        overridePendingTransition(R.anim.trans_previous_in,
                R.anim.trans_previous_out);// 進入動畫和退出動畫
    }
}

BootCompleteReceiver.java


public class BootCompleteReceiver extends BroadcastReceiver {
    // 監聽手機開機啟動的廣播    
        @Override
        public void onReceive(Context context, Intent intent) {
            SharedPreferences sp = context.getSharedPreferences("config",
                    Context.MODE_PRIVATE);
            boolean protect = sp.getBoolean("protect", false);
            // 只有在防盜保護開啟的前提下才進行sim卡判斷
            if (protect) {
                String sim = sp.getString("sim", null);// 獲取綁定的sim卡

                if (!TextUtils.isEmpty(sim)) {
                    // 獲取當前手機的sim卡
                    TelephonyManager tm = (TelephonyManager) context
                            .getSystemService(Context.TELEPHONY_SERVICE);
                    String currentSim = tm.getSimSerialNumber() + "111";// 拿到當前手機的sim卡

                    if (sim.equals(currentSim)) {
                        System.out.println("手機安全");
                    } else {
                        System.out.println("sim卡已經變化, 發送報警簡訊!!!");
                        String phone = sp.getString("safe_phone", "");// 讀取安全號碼

                        // 發送簡訊給安全號碼
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(phone, null,
                                "sim card changed!", null, null);
                    }
                }
            }
        }

}

 

我們開啟5554和5556的模擬器,給5554安全號碼設置為5556,我們給5554的sim卡序列號變化,那麼開機重啟5554,開機啟動的廣播就會
檢測到sim卡變更,發送簡訊給5556,5556就會接收到5554發送來的簡訊。
SmsReceiver .java
//攔截簡訊
public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Object[] objects = (Object[]) intent.getExtras().get("pdus");

        for (Object object : objects) {// 簡訊最多140位元組,
                                        // 超出的話,會分為多條簡訊發送,所以是一個數組,因為我們的簡訊指令很短,所以for迴圈只執行一次
            SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
            String originatingAddress = message.getOriginatingAddress();// 簡訊來源號碼
            String messageBody = message.getMessageBody();// 簡訊內容

            System.out.println(originatingAddress + ":" + messageBody);

            if ("#*alarm*#".equals(messageBody)) {
                // 播放報警音樂, 即使手機調為靜音,也能播放音樂, 因為使用的是媒體聲音的通道,和鈴聲無關
                MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
                player.setVolume(1f, 1f);
                player.setLooping(true);
                player.start();
           
                abortBroadcast();// 中斷簡訊的傳遞, 從而系統簡訊app就收不到內容了
            } else if ("#*location*#".equals(messageBody)) {
                // 獲取經緯度坐標
                context.startService(new Intent(context, LocationService.class));// 開啟定位服務
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 修改定價將你的app定價修改成0.99刀 修改你的發行範圍,全取消後只選中國。 save這時候你的app status將會變成pending contract。 將之前的修改都改回來,修改定價free,全選區域,然後save 這時候app status又會變成Ready for sale了,過個半小 ...
  • Controller控制器 import android.app.Dialog; import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; ...
  • App的開發無外乎從網路端獲取數據顯示在屏幕上,數據做些緩存或者持久化,所以網路層極為重要。原來只是把AFNetwork二次封裝了一下,使得調用變得很簡單,並沒有深層次的考慮一些問題。 前言 參考: "網路層設計方案" 這篇文章提的問題也正是我平時經常糾結的,但是一直沒有深入思考。文章給的解決方案和 ...
  • 一、創建項目目錄 創建工程的時候規定一下目錄,規定目錄就是規定自己的架構,結構層次分明,方便查找。 創建Classes目錄(裡面放自定義類),繼續在該目錄下創建: Show:展示模塊,主要負責展示 View:視圖層 ViewController:控制器層 Model:模型層 Handler:業務處理 ...
  • 先上官網 http://jakewharton.github.io/butterknife/ 和 https://github.com/JakeWharton/butterknife 配置開發環境 在代碼開始之前 先要將庫加入依賴 Eclipse 去官網手工下載 jar 包, 放到 libs目錄 或 ...
  • Swift一齣來就比較受人歡迎,但是還是有很多的第三方庫是不支持Swift的,個人也感覺Swift還有很長的路要走。 而且最近連Swift的創始人都離開蘋果公司了。。。。。。。。。 加入Swift用到了第三方的東西那怎麼辦呢,其實很簡單,Xcode會自動幫你創建一個橋接文件,用來連接Swift和OC ...
  • 設置的主界面的可以通過修改xml中的dashboard_categaries.xml 文件實現,在DashboardSummary.java 文件中的rebuildUI()方法中將xml對應的實體類轉換成對應的view,具體細節可以看設置源碼。 一,dashboard_categaries中定義節點 ...
  • CoordinatorLayout的使用筆記 CollapsingToolbarLayout有兩個Children.ImageView用來顯示大圖.而Toolbar就是摺疊後看到的頂欄Toolbar. app:contentScrim="?attr/colorPrimary" ,Collapsing ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...