Androidプロジェクト:携帯電話セキュリティガード(6)--携帯電話防犯設置ガイド(二)

9166 ワード

Androidプロジェクト:携帯電話セキュリティガード(6)--携帯電話防犯設置ガイド(二)
1紹介
前の記事では、セットアップウィザードのインタフェースとスイッチングロジックについて説明しましたが、今日は各インタフェースの後ろにあるコードロジックを見てみましょう.主な知識は次のとおりです.
  • 携帯電話simカードシリアル番号
  • を読み取る
  • 携帯電話の再起動が完了した放送を傍受する
  • 携帯電話の通信録
  • を読み取る
    プロジェクトに関する記事については、以下を参照してください.
  • Androidプロジェクト:携帯電話セキュリティガード(1)-フラッシュ画面
  • Androidプロジェクト:携帯電話セキュリティガード(2)-バージョンアップ
  • Androidプロジェクト:携帯電話セキュリティガード(3)-メインインタフェースレイアウト
  • Androidプロジェクト:携帯電話セキュリティガード(4)-カスタム(組み合わせ)コントロール、属性
  • Androidプロジェクト:携帯電話セキュリティガード(5)-カスタム弾窓
  • Androidプロジェクト:携帯電話セキュリティガード(6)-携帯電話防犯設置ガイド
  • プロジェクトのソースアドレス(リアルタイム更新):https://github.com/xwdoor/MobileSafe
    2携帯SIMカードのシリアル番号を読み取る
    simカードのシリアル番号を読み込み、SharedPreferencesで保存します.次はコードです.
    
        //      
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        //   sim     
        String simSerialNumber = tm.getSimSerialNumber();

    それだけで、システムは間違っています:java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10053 nor current process has android.permission.READ_PHONE_STATE.これは権限を追加していない結果、携帯電話の状態を読み取る権限を追加する必要があります:<uses-permission android:name="android.permission.READ_PHONE_STATE" />3携帯電話の再起動が完了したReceiver放送を傍受する
    simカードをバインドした後、次に必要なのは、携帯電話の起動が完了するたびに、携帯電話のsimカードが変化しているかどうかを検出し、ブロードキャスト受信機BootCompleteReceiverを作成し、BroadcastReceiverから継承することです.
    
        public class BootCompleteReceiver extends BroadcastReceiver {
            public BootCompleteReceiver() {
            }
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String serialNumber = PrefUtils.getString(BaseActivity.PREF_BIND_SIM,"",context);
    
                if(!TextUtils.isEmpty(serialNumber)){
                    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                    String simSerialNumber = tm.getSimSerialNumber();
    
                    if(serialNumber.equals(simSerialNumber)){
                        Log.i(BaseActivity.TAG_LOG,"    ");
                    }else {
                        Log.i(BaseActivity.TAG_LOG,"SIM     ,  ");
    
                    }
                }
            }
        }

    もちろん、この時点ではコードの処理ロジックは追加されておらず、ログを出力するだけです.なお、ブロードキャストを受信するには、<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>の作成が完了した後、ブロードキャスト受信機を登録する必要があり、そのactionは:BOOT_である.COMPLETED、コードは以下の通り:
    
        <receiver  android:name=".receiver.BootCompleteReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    4携帯電話のアドレス帳を読み取る
    システムのContentProviderにアクセスして通信録を読み取ると、システムにはraw_contacts,data,mimetypes,私たちの大まかな考え方は:
  • raw_を読み込むcontacts、contact_を取得id
  • contact_によるid,dataから具体情報(名前/電話)data 1,mimetype_を読み出すid
  • mimetype_によるとid,mimetypesから特定のタイプ
  • を調べる
    
        /** *       */
        private ArrayList<HashMap<String, String>> readContacts() {
            // raw_contacts, data, mimetypes
            // 1.   raw_contacts,   contact_id
            // 2.   contact_id,  data       (  /   ) data1, mimetype_id
            // 3.   mimetype_id,  mimetypes       
    
            // 1.   raw_contacts,   contact_id
            Cursor rawCursor = getContentResolver().query(Uri.parse("content://com.android.contacts/raw_contacts"),
                    new String[]{"contact_id"}, null, null, null);
    
            ArrayList<HashMap<String, String>> listContacts = new ArrayList<>();
            if (rawCursor != null) {
                while (rawCursor.moveToNext()) {
                    String contactId = rawCursor.getString(rawCursor.getColumnIndex("contact_id"));
    
                    // 2.   contact_id,  data       (  /   ) data1, mimetype_id
                    //      data  ,        view_data    ,    data mimetypes            
                    Cursor cursor = getContentResolver().query(Uri.parse("content://com.android.contacts/data"),
                            new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{contactId}, null);
    
                    HashMap<String, String> map = new HashMap<>();
                    if (cursor != null) {
                        while (cursor.moveToNext()) {
                            String data = cursor.getString(cursor.getColumnIndex("data1"));
                            String mimetype = cursor.getString(cursor.getColumnIndex("mimetype"));
    
                            if ("vnd.android.cursor.item/name".equals(mimetype)) {
                                //  
                                map.put("name", data);
                            } else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
                                //  
                                map.put("phone", data);
                            }
                        }
                        cursor.close();
    
                        if (!TextUtils.isEmpty(map.get("name")) && !TextUtils.isEmpty(map.get("phone"))) {//       
                            listContacts.add(map);
                        }
                    }
    
                }
                rawCursor.close();
            }
            return listContacts;
        }

    それだけで、システムはエラーを報告します:java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 requires android.permission.READ_CONTACTS, or grantUriPermission().追加権限が必要です:<uses-permission android:name="android.permission.READ_CONTACTS"/>5まとめ
    今日の知識点は役に立つと思います.システムが提供するサービスを使っています.これらのサービスは一般的にアクセス権が必要です.だから、アクセス権を加えることを忘れないでください.私も何度も忘れました.覚えておいてください.
    プロジェクトに関する記事については、以下を参照してください.
  • Androidプロジェクト:携帯電話セキュリティガード(1)-フラッシュ画面
  • Androidプロジェクト:携帯電話セキュリティガード(2)-バージョンアップ
  • Androidプロジェクト:携帯電話セキュリティガード(3)-メインインタフェースレイアウト
  • Androidプロジェクト:携帯電話セキュリティガード(4)-カスタム(組み合わせ)コントロール、属性
  • Androidプロジェクト:携帯電話セキュリティガード(5)-カスタム弾窓
  • Androidプロジェクト:携帯電話セキュリティガード(6)-携帯電話防犯設置ガイド
  • プロジェクトのソースアドレス(リアルタイム更新):https://github.com/xwdoor/MobileSafe