【边做项目边学Android】手机安全卫士11-设置向导之设置安全号码

这次主要实现设置安全号码的功能,即当发现手机SIM卡信息发生改变时,会自动给安全号码发送一条报警短信。主要包括选择联系人功能。涉及到的知识点包括:带返回值的Intent,ListView数据适配器。

选择联系人功能

  • 界面

用ListView来对读取的联系人进行展示

/mobilesafe/res/layout/select_contact.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:background="@color/background"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/lv_select_contact"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        ></ListView>

</LinearLayout>

获取手机联系人数据

联系人数据封装实体

  • /mobilesafe/src/com/liuhao/mobilesafe/domain/ContactInfo.java

package com.liuhao.mobilesafe.domain;

/**
 * 联系人数据
 *
 * @author liuhao
 *
 */
public class ContactInfo {

    private String name;
    private String phone;

    public ContactInfo() {

    }

    public ContactInfo(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}

获取联系人数据业务类

  • /mobilesafe/src/com/liuhao/mobilesafe/engine/ContactInfoService.java

package com.liuhao.mobilesafe.engine;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;

import com.liuhao.mobilesafe.domain.ContactInfo;

public class ContactInfoService {

    private Context context;

    public ContactInfoService(Context context) {
        this.context = context;
    }

    public List<ContactInfo> getContactInfos() {

        ContentResolver resolver = context.getContentResolver();

        // 1.获取联系人的id
        // 2.根据联系人的id获取联系人姓名
        // 3.根据联系人id 数据的type,获取对应的数据(电话,email等)

        List<ContactInfo> infos = new ArrayList<ContactInfo>();
        ContactInfo info;

        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");

        Cursor cursor = resolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            info = new ContactInfo();

            String id = cursor.getString(cursor.getColumnIndex("_id"));
            String name = cursor.getString(cursor.getColumnIndex("display_name"));
            if(name==null) continue;
//          System.out.println(name);
            info.setName(name);

            Cursor dataCursor = resolver.query(dataUri, null, "raw_contact_id=?", new String[]{id}, null);
            while(dataCursor.moveToNext()){
                String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
                String phone = dataCursor. getString(dataCursor.getColumnIndex("data1"));
                if(phone==null || type==null) continue;

                // 若是电话号码才添加
                if("vnd.android.cursor.item/phone_v2".equals(type)){
                    info.setPhone(phone);
                }

//              System.out.println(phone);
//              System.out.println(type);
//              System.out.println("-------");
            }
            infos.add(info);
            info = null;
            dataCursor.close();
//          System.out.println("####################3");
        }
        cursor.close();
        return infos;
    }

}

数据适配


package com.liuhao.mobilesafe.ui;

import java.util.List;

import com.liuhao.mobilesafe.R;
import com.liuhao.mobilesafe.domain.ContactInfo;
import com.liuhao.mobilesafe.engine.ContactInfoService;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class SelectContactActivity extends Activity {

    private ListView lv;
    private List<ContactInfo> infos;

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

        setContentView(R.layout.select_contact);

        ContactInfoService service = new ContactInfoService(this);
        infos = service.getContactInfos();// 获取到联系人数据

        lv = (ListView) this.findViewById(R.id.lv_select_contact);
        lv.setAdapter(new SelectContactAdapter());// 将联系人数据适配到ListView中
        lv.setOnItemClickListener(new OnItemClickListener() {// 设置点击每个条目时的响应事件

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String phone = infos.get(position).getPhone();// 获取到该联系人的号码
                Intent intent = new Intent();
                intent.putExtra("phone", phone);// 将号码数据设置到Intent中
                setResult(0, intent);// Call this to set the result that your activity will return to its caller. 将Intent结果返回给调用者
                finish();
            }

        });

    }

    private class SelectContactAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return infos.size();
        }

        @Override
        public Object getItem(int position) {
            return infos.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ContactInfo info = infos.get(position);
            LinearLayout ll = new LinearLayout(SelectContactActivity.this);
            ll.setOrientation(LinearLayout.VERTICAL);
            TextView tv_name = new TextView(SelectContactActivity.this);
            tv_name.setText("联系人:" + info.getName());
            tv_name.setTextColor(getResources().getColor(R.color.textcolor));
            TextView tv_phone = new TextView(SelectContactActivity.this);
            tv_phone.setText("电话:" + info.getPhone());
            tv_phone.setTextColor(getResources().getColor(R.color.textcolor));
            ll.addView(tv_name);
            ll.addView(tv_phone);
            return ll;
        }

    }

}

Activity直接传递数据


package com.liuhao.mobilesafe.ui;

import com.liuhao.mobilesafe.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class SetupWizard3Activity extends Activity implements OnClickListener {

    private Button bt_select_contact;
    private Button bt_next;
    private Button bt_prev;
    private EditText et_number;

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

        bt_select_contact = (Button) this.findViewById(R.id.bt_select_contact);
        bt_next = (Button) this.findViewById(R.id.bt_next);
        bt_prev = (Button) this.findViewById(R.id.bt_previous);
        et_number = (EditText) this.findViewById(R.id.et_setup3_phonenumber);

        bt_select_contact.setOnClickListener(this);
        bt_next.setOnClickListener(this);
        bt_prev.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.bt_select_contact:
            Intent intent = new Intent(this, SelectContactActivity.class);
            // 激活一个带返回值的界面
            startActivityForResult(intent, 0);
            break;
        case R.id.bt_next:
            finish();// 用户点击“后退”时不会再看到这个界面
            Intent intent4 = new Intent(this, SetupWizard4Activity.class);
            startActivity(intent4);
            // 设置Activity切换时的动画效果
            overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
            break;
        case R.id.bt_previous:
            finish();// 用户点击“后退”时不会再看到这个界面
            Intent intent2 = new Intent(this, SetupWizard2Activity.class);
            startActivity(intent2);
            // 设置Activity切换时的动画效果
            overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
            break;

        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(data != null){
            String phone = data.getStringExtra("phone");
            et_number.setText(phone);
            et_number.setTextColor(getResources().getColor(R.color.textcolor));
        }

    }

}
时间: 2024-10-28 09:36:08

【边做项目边学Android】手机安全卫士11-设置向导之设置安全号码的相关文章

【边做项目边学Android】手机安全卫士01:splash界面ui

手机安全卫士项目是跟着黑马的视频做的. splash是飞洒.飞溅的意思,主要是用于完成一个产品logo显示,期间可以: 后台完成数据库初始化的操作 联网访问服务器,获取服务器最新信息(升级提示) 不同的日期显示出来不同logo,判断当前系统时间,素材一般从服务器上下载下来. 判断时间,根据不同时间显示不同的加载页面 布局文件:splash.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou

【边做项目边学Android】手机安全卫士04_01:界面(Activity)之间的切换,Activity和任务栈

上一回说到,用户选择是否升级,若用户选择不升级,那么就要进入程序的主界面.下面要做的是从splash界面跳转到main界面. MainActivity创建 1.首先新建MainActivity: package com.liuhao.mobilesafe.ui; import com.liuhao.mobilesafe.R; import android.app.Activity; import android.os.Bundle; public class MainActivity exten

【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1

本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进入设置向导界面. 具体实现: 1.当用户输入"手机防盗"密码正确时,进行判断用户是否进行过设置向导 /** * 判断用户是否进行过设置向导 * @return */ private boolean isSetup(){ return sp.getBoolean("isAlread

【边做项目边学Android】手机安全卫士08-一些布局和显示的细节:State List

我们注意到有些应用里的按钮在点击时的显示状态和普通状态是不一样的,比如: 普通状态下: 选中状态下: 那这种效果是如何实现的呢?在Android系统中提供给我们一种方便与实现这种功能的方法即:state list drawable. StateListDrawable是在XML中定义的drawable对象,我们可以通过设置不同item下的图片来显示不同状态,这取决于 drawable对象的状态.例如,一个Button控件可以有不同的状态(点击.聚焦等),通过一系列的drawable对象,可以为每

【边做项目边学Android】手机安全卫士03:获取更新的服务器配置,显示更新对话框

配置应用程序在手机桌面显示的名称和图标-AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.liuhao.mobilesafe" android:versionCode="

【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/res/layout/setup_wizard1.xml /mobilesafe/res/layout/setup_wizard2.xml /mobilesafe/res/layout/setup_wizard3.xml /mobilesafe/res/layout/setup_wizard4.xml

【边做项目边学Android】手机安全卫士05_1:程序主界面

主界面布局(知识点:GridView) mainscreen.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=

【边做项目边学Android】手机安全卫士07-手机防盗之进入限制

上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码:再次进入时会要求用户输入密码:这次来具体实现上述功能. 首次登录,设置密码 首先,我们的密码是保存在SharePreference中的"password"字段里的,在登录时后台需要校验该字段是否已经设置了密码,若未设置则弹出对话框让用户设置,否则要用户输入密码进入手机防盗界面: 校验是否设置了密码 @Override protected void onCreate(Bundle savedIn

【边做项目边学Android】手机安全卫士05_2:程序主界面,为每个条目添加事件

为每个条目添加点击事件监听器 gv_main.setOnItemClickListener(this); 需要当前Activity实现OnItemClickListener接口,同时实现public void onItemClick(AdapterView<?> parent, View view, int position,long id)方法 /** * 当gridview的条目被点击的时候对应的回调 * parent : gridView * view : 当前被点击条目的 Linear