Android学习之一:通讯录

来源:互联网 发布:口风琴基础教程软件 编辑:程序博客网 时间:2024/06/11 18:41

自己练手的一个小程序。
有如下功能:
1.读取系统联系人信息,将联系人姓名、号码、邮箱和头像读取出来,显示到界面上。
2.对系统联系人信息进行增删改查。
3.可以调用系统的拨号功能,进行拨打电话的操作。
4.通过一个免费的查询号码归属地的api接口,可以对某个号码的归属地进行查询。


非常简单的一个小程序。但是因为新手,各种不熟悉,所以过程还是有点艰辛,遇到了好多bug。
得到的:
在这个过程中,对于ContentProvider有了更深的了解。尤其是可以通过一个Uri获取到联系人的所有信息,这个学到了。
对HttpConnection和JSON格式的解析也有了更深的了解。
不足的:
联系人头像,本程序中可以通过拍照然后裁剪、从相册选取照片然后裁剪,设置到ImageView上。对这里尤其不熟,查了很多资料。但是仍旧不成功。在论坛上问人,终于知道魅族手机的照片裁剪跟别的手机不一样。好心塞。
遗憾:
系统联系人姓名展示在listview中,应该是进行首字母排序的。我在网上搜了搜,中文首字母排序有点麻烦。以后再增加这个功能吧。

吶,不管过程怎么样,最后做出来还是挺开心的。
贴代码吧:


首先是展示系统所有的联系人

public class Contacts extends Activity implements View.OnClickListener,AdapterView.OnItemClickListener{    /**     * uri     * */    public static final Uri ContactsUri = ContactsContract.Contacts.CONTENT_URI;    public final String ID = ContactsContract.Contacts._ID;    public final String NAME = ContactsContract.Contacts.DISPLAY_NAME;    /**     * serch标识     * */    public static boolean FROM_SERCH = false;    /**     * contentresover对象     * */    public ContentResolver contentResolver;    /**     * 控件初始化     * */    public ListView listView;    public EditText input;    public Button serch;    /**     * 数据源初始化     * */    public List<String> contactsList;    /**     * 适配器初始化     * */    public ArrayAdapter<String> adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_contacts);        //控件初始化和监听事件        init();        //读取系统联系人,存储到contactsList 中        contactsList = new ArrayList<String>();        readContacts();        //视图加载适配器        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);        listView.setAdapter(adapter);    }    /**     * 复写onresume方法,当本页面重新获取焦点时,刷新listview内容     * */    @Override    protected void onResume() {        super.onResume();        //从数据库中重新获取所有的联系人名字,然后listview更新        contactsList.clear();//先清除list集合中原有的联系人name,然后重新获取,否则会重复加载多个联系人的name        readContacts();        adapter = null;        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);        listView.setAdapter(adapter);    }    /**     * 控件初始化     * */    public void init(){        listView = (ListView) findViewById(R.id.listview);        input = (EditText) findViewById(R.id.serch);        serch = (Button) findViewById(R.id.bt_serch);        //点击事件        serch.setOnClickListener(this);        listView.setOnItemClickListener(this);    }    /**     * 获取联系人名字     * */    public void readContacts(){        //获取contentResolver对象        contentResolver = getContentResolver();        //查询联系人id和名字        Cursor cursor =                contentResolver.query(ContactsUri,null,null,null,null);        while (cursor.moveToNext()){            String id = cursor.getString(cursor.getColumnIndex(ID));            Log.i("test",id);            String name = cursor.getString(cursor.getColumnIndex(NAME));            Log.i("test", name);            //联系人名字加入list集合中,            contactsList.add(name);        }        if (cursor != null){            cursor.close();        }    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.bt_serch:                String serchName = input.getText().toString();                Log.i("test",serchName);                List<String> serchNameList = new ArrayList<String>();                //在contactsList中进行匹配,看是否有这个名字,如果有,每查到一个人,就存储到contactsList中。                for(int i = 0;i<contactsList.size();i++){                    String name = contactsList.get(i);                    if(name.contains(serchName)){                        serchNameList.add(name);                    }                }                //更新listview                adapter = null;                adapter = new ArrayAdapter<String>(Contacts.this,android.R.layout.simple_list_item_1,serchNameList);                listView.setAdapter(adapter);                input.setText("");                Log.i("test", "contactsList内容更新");                FROM_SERCH = true;                break;        }    }    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        String personName = contactsList.get(position);        String personID = null;        //根据name查找contacts中的id,将id发送过去        contentResolver = getContentResolver();        Cursor cursorId =                contentResolver.query(ContactsContract.Contacts.CONTENT_URI,                        null,                        ContactsContract.Contacts.DISPLAY_NAME +"=?",                        new String[]{personName},                        null);        while (cursorId.moveToNext()){            personID =                    cursorId.getString(cursorId.getColumnIndex(ContactsContract.Contacts._ID));        }        Log.i("test",personID);//      弹出联系人详情页面        Intent contactIntent = new Intent(Contacts.this,OneContact.class);        contactIntent.putExtra("person_id",personID);        startActivity(contactIntent);        Log.i("test","下一个页面");    }    /**     * 复写back键     * */    @Override    public void onBackPressed() {        if (FROM_SERCH == true){            adapter = null;            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);            listView.setAdapter(adapter);            FROM_SERCH = false;        }else {            finish();        }    }}

然后是某个联系人的详细信息界面:

/** * Created by lee on 2016/10/8. * 联系人详情界面 */public class OneContact extends Activity implements View.OnClickListener{    /**     * uri     * */    public final Uri DataUri = ContactsContract.Data.CONTENT_URI;    public final String DataID = ContactsContract.Data.CONTACT_ID;    public final String DataMimeType = ContactsContract.Data.MIMETYPE;    public final String DataData1 = ContactsContract.Data.DATA1;    public final String DataIcon = ContactsContract.Data.DATA15;    /**     * 控件     * */    private ImageView icon,edit_icon;    private TextView name,num,email,location;    private EditText et_name,et_num,et_email;    private Button bt_ok,edit,delete;    private Button bt_serch_location;    private LinearLayout edit_name,edit_num,edit_email,linera_button,linear_name,linear_num,linear_email;    /**     * ContentResolver     * */    private ContentResolver contentResolver;    /**     * 联系人信息     * */    private String personID = null;    private String personNum = null;    private String personEmail = null;    private String personName = null;    private byte[] personIcon = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.one_contact_layout);        /**         * 控件初始化和监听事件         * */        init();        //存储拍照的照片和裁剪照片的file初始化        File file = new File(appDaultDir+File.separator+"tempImage.jpg");        imageuri = Uri.fromFile(file);        File cropFile = new File(appDaultDir+File.separator+"temp_crop.jpg");        imageCropUri = Uri.fromFile(cropFile);        //从intent中获取personid。        Intent intent = getIntent();        personID = intent.getStringExtra("person_id");        // 根据personid,获取num,email,icon;        getNameNumEmailIcon(personID);//        Log.i("test", "id" + personID + "_--" + "名字" + personName + "_--" + "电话" + personNum + "_--" + "邮箱" + personEmail + "照片" + personIcon);        //将name,num,email显示在控件中        name.setText(personName);        num.setText(personNum);        email.setText(personEmail);        //将personicon显示在控件中        if (personIcon == null){            //数据库没有照片,什么都不显示            return;        }else{            //数据库中有联系人照片,则加载数据库中照片;            Bitmap bitmap = BitmapFactory.decodeByteArray(personIcon,0,personIcon.length);            icon.setImageBitmap(bitmap);        }    }    /**     * 根据id从内容提供者中获取name,num,email,icon的方法     * 从一个cursor中获取这些信息,这是我通过这个练手学到的     * */    public void getNameNumEmailIcon(String personID){        contentResolver = getContentResolver();        //根据personID,从一个cursor中获取name,num,email        Cursor cursorInfo =                contentResolver.query(DataUri,                        new String[]{DataID,DataMimeType,DataData1,DataIcon},                        DataID+"=?",                        new String[]{personID},                        null);        while (cursorInfo.moveToNext()){            String mimetype =                    cursorInfo.getString(cursorInfo.getColumnIndex(DataMimeType));            String value =                    cursorInfo.getString(cursorInfo.getColumnIndex(DataData1));            //获取icon            personIcon = cursorInfo.getBlob(cursorInfo.getColumnIndex(DataIcon));            //获取name            if (mimetype.contains("/name")){                personName = value;            }else if (mimetype.contains("/email")){                //获取email                personEmail = value;            }else if (mimetype.contains("/phone")){                //获取num                personNum = value;            }}        }    /**     * 控件初始化,监听事件     * */    public void init(){        //imageview        icon = (ImageView) findViewById(R.id.iv_icon);        edit_icon = (ImageView) findViewById(R.id.edit_icon);        //textview        name = (TextView) findViewById(R.id.tv_name);        num = (TextView) findViewById(R.id.tv_num);        email = (TextView) findViewById(R.id.tv_email);        //button        edit = (Button) findViewById(R.id.bt_edit);        delete = (Button) findViewById(R.id.bt_delete);        bt_serch_location = (Button) findViewById(R.id.serch_location);        //edittext        et_name = (EditText) findViewById(R.id.et_name);        et_num = (EditText) findViewById(R.id.et_num);        et_email = (EditText) findViewById(R.id.et_email);        //button        bt_ok = (Button) findViewById(R.id.bt_ok);        //linearlayout        edit_name = (LinearLayout) findViewById(R.id.edit_name);        edit_num = (LinearLayout) findViewById(R.id.edit_num);        edit_email = (LinearLayout) findViewById(R.id.edit_email);        linera_button = (LinearLayout) findViewById(R.id.linear_button);        linear_name = (LinearLayout) findViewById(R.id.linera_name);        linear_num = (LinearLayout) findViewById(R.id.linear_num);        linear_email = (LinearLayout) findViewById(R.id.linear_email);        //监听事件        edit.setOnClickListener(this);        delete.setOnClickListener(this);        bt_ok.setOnClickListener(this);        edit_icon.setOnClickListener(this);        num.setOnClickListener(this);        bt_serch_location.setOnClickListener(this);    }    /**     * 点击事件     * */    @Override    public void onClick(View v) {        switch (v.getId()){        //查询某个号码的归属地的按钮            case R.id.serch_location:                Intent intent2 = new Intent(OneContact.this,LocationActivity.class);                intent2.putExtra("number",personNum);                startActivity(intent2);                break;            case R.id.tv_num:                //隐式intent,调用系统拨号界面                Intent intent = new Intent(Intent.ACTION_DIAL);                intent.setData(Uri.parse("tel:"+personNum));                startActivity(intent);                break;            case R.id.edit_icon:                //初始化路径                appDaultDir = Environment.getExternalStorageDirectory().getAbsolutePath();//                Log.i("test",appDaultDir);                //显示选择对话框                showPhotoDialog();                break;            case R.id.bt_edit:                //隐藏textview                linear_name.setVisibility(View.GONE);                linear_num.setVisibility(View.GONE);                linear_email.setVisibility(View.GONE);                //隐藏头像view                icon.setVisibility(View.GONE);                //隐藏编辑和删除键                linera_button.setVisibility(View.GONE);                //显示edittext,button                edit_name.setVisibility(View.VISIBLE);                edit_num.setVisibility(View.VISIBLE);                edit_email.setVisibility(View.VISIBLE);                bt_ok.setVisibility(View.VISIBLE);                //显示头像view                edit_icon.setVisibility(View.VISIBLE);                //显示原来的名字号码邮件                et_name.setText(personName);                et_num.setText(personNum);                et_email.setText(personEmail);                //显示头像                if (personIcon == null){                    return;                }else{                    Bitmap bitmap = BitmapFactory.decodeByteArray(personIcon,0,personIcon.length);                    edit_icon.setImageBitmap(bitmap);                }//                Log.i("test","textiew控件隐藏,edittext,button控件显示");                break;            case R.id.bt_ok:                //根据用户输入的name和num和Email和icon,更新系统联系人信息                String newName = et_name.getText().toString();                String newNum = et_num.getText().toString();                String newEmail = et_email.getText().toString();                Bitmap newBitmap =((BitmapDrawable)edit_icon.getDrawable()).getBitmap();                //newBitmap转为byte[]                ByteArrayOutputStream stream = new ByteArrayOutputStream();                newBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);                byte[] newPersonIcon = stream.toByteArray();//                Log.i("test","新的联系人信息");                //更新数据库中的联系人信息                if ((!TextUtils.isEmpty(newName))&&(!TextUtils.isEmpty(newNum))){                    //只有名字和号码都不为空时,才会去更新系统联系人信息                    updateOneContact(personID, newName, newNum, newEmail, newPersonIcon);                    //更新完成后,隐藏edittext和button                    edit_name.setVisibility(View.GONE);                    edit_num.setVisibility(View.GONE);                    edit_email.setVisibility(View.GONE);                    bt_ok.setVisibility(View.GONE);                    //显示textview                    linear_name.setVisibility(View.VISIBLE);                    linear_num.setVisibility(View.VISIBLE);                    linear_email.setVisibility(View.VISIBLE);                    //显示imageview                    icon.setVisibility(View.VISIBLE);                    //显示按钮                    linera_button.setVisibility(View.VISIBLE);                    //重新从数据库中,根据id获取联系人信息                    getNameNumEmailIcon(personID);                    //将新的信息显示在textview上                    name.setText(personName);                    num.setText(personNum);                    email.setText(personEmail);                    //将新的头像显示在不可编辑的imageview上                    Bitmap bitmap = BitmapFactory.decodeByteArray(newPersonIcon, 0, newPersonIcon.length);                    icon.setImageBitmap(bitmap);                }else {                    Toast.makeText(OneContact.this,"名字和号码不能为空",Toast.LENGTH_SHORT).show();                }                break;            case R.id.bt_delete:                //弹出对话框,确认是否删除                showMyDialog();                break;        }    }    /**     * requestCode     * */    public static final int CROP_PHOTO = 1;    public static final int TAKE_PHOTO = 2;    private Uri imageuri;    private Uri imageCropUri;    private String appDaultDir = null;    /**     * 拍照     * */    public void takePhotoFromPhone(){//        Log.i("test","调用takePhotoFromPhone方法");        //构建隐式intent,调用相机        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");        intent.putExtra("filePath", imageuri);        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);        startActivityForResult(intent, TAKE_PHOTO);    }    /**     * 调用系统相册,选择图片作为头像     * */    public void getPhotoFromPhone(){//        Log.i("test", "调用getPhotoFromPhone方法");        //隐式intent,启动相册        Intent intent = new Intent("android.intent.action.GET_CONTENT");        intent.setType("image/*");        intent.putExtra("crop", true);        intent.putExtra("scale", true);        intent.putExtra("filePath",imageuri);        intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);        startActivityForResult(intent, CROP_PHOTO);    }    /**     * onActivityResult方法     * */    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        contentResolver = getContentResolver();        switch (requestCode){            case TAKE_PHOTO:                if (resultCode == RESULT_OK){                    //隐式intent,调用裁剪功能                    Intent intent = new Intent("com.android.camera.action.CROP");                    intent.setDataAndType(imageuri, "image/*");                    intent.putExtra("scale",true);                    intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);                    startActivityForResult(intent,CROP_PHOTO);                }                break;            case CROP_PHOTO:                if (resultCode == RESULT_OK){                    Log.i("test","启动裁剪程序");                    // 拿到剪切数据                    String filePath = data.getStringExtra("filePath");                    Bitmap bitmap = BitmapFactory.decodeFile(filePath);                    //将bitmap缩小//                    bitmap = setScaleBitmap(bitmap,5);                    //将选取的照片显示在imageview上                    edit_icon.setImageBitmap(bitmap);                    Log.i("test","将选取的照片显示在imageview上");                }        break;        }    }    /**     * 将图片缩小     * */    public Bitmap setScaleBitmap(Bitmap photo,int scale){        if (photo!=null){            Bitmap smallBitmap = zoomBitmap(photo,photo.getWidth()/scale,photo.getHeight()/scale);            photo.recycle();            return smallBitmap;        }        return null;    }    /**     * 实际缩小图片的方法     * */    private Bitmap zoomBitmap(Bitmap bitmap,int width,int height){        int w = bitmap.getWidth();        int h = bitmap.getHeight();        Matrix matrix = new Matrix();        float matrixX = width/w;        float matrixY = height/h;        matrix.postScale(matrixX,matrixY);        Bitmap newBitmap = bitmap.createBitmap(bitmap,0,0,w,h,matrix,true);        return newBitmap;    }    /**     * 显示头像选择对话框     * */    public void showPhotoDialog(){        final int[] MyWhich = {0};        //点击头像图片后,弹出对话框,选择拍照或者相册        AlertDialog.Builder dialog = new AlertDialog.Builder(OneContact.this);        Log.i("test","创建头像选择对话框");        //下拉框的数据源        String[] choose = {"拍照","从相册选择"};        dialog.setSingleChoiceItems(choose, 0, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                MyWhich[0] = which;            }        });        //设置确定和取消按钮        dialog.setNegativeButton("取消",null);        dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                if (MyWhich[0] == 0){                    //拍照                    takePhotoFromPhone();                }else if(MyWhich[0] == 1){                    //相册                    getPhotoFromPhone();                }            }        });        //显示对话框        dialog.show();    }    /**     * 更新数据库中联系人信息     * */    public void updateOneContact(String personID,String newName,String newNum,String newEmail, byte[] newIcon){        contentResolver = getContentResolver();        ContentValues values = new ContentValues();        //更新name        values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, newName);        contentResolver.update(                DataUri,                values,                ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " +                        ContactsContract.RawContacts.Data.MIMETYPE + "=?",                new String[]{                        personID,                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE});        values.clear();//        Log.i("test", "name更新完成");        //更新num        values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, newNum);        contentResolver.update(                DataUri,                values,                ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " +                        ContactsContract.RawContacts.Data.MIMETYPE + "=?",                new String[]{                        personID,                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE});        values.clear();//        Log.i("test", "num更新完成");        //更新email        values.put(ContactsContract.CommonDataKinds.Email.DATA, newEmail);        contentResolver.update(                DataUri,                values,                ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " +                        ContactsContract.RawContacts.Data.MIMETYPE + "=?",                new String[]{                        personID,                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE});        values.clear();//        Log.i("test", "email更新完成");        //更新icon        values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, newIcon);        contentResolver.update(                DataUri,                values,                ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " +                        ContactsContract.RawContacts.Data.MIMETYPE + "=?",                new String[]{                        personID,                        ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE});        values.clear();//        Log.i("test", "photo更新完成");    }    /**     * 弹出对话框,是否删除该联系人     * */    public void showMyDialog(){        //创建对话框        AlertDialog.Builder dialog = new AlertDialog.Builder(OneContact.this);        //设置标题        dialog.setTitle("确认删除");        //设置信息        dialog.setMessage("是否删除本联系人信息?");        //设置确认按钮点击事件        dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                //点击对话框的确定后,删除该信息                //根据联系人id,删除联系人                contentResolver = getContentResolver();                Uri uri = Uri.withAppendedPath(ContactsContract.RawContacts.CONTENT_URI, personID);//                Log.i("test", "要删除的联系人id" + personID);                contentResolver.delete(uri, null, null);//                Log.i("test", "删除成功");                //直接返回Contacts界面,重新从数据库中加载listview(因为删除了一个联系人)                Intent contactsIntent = new Intent(OneContact.this, Contacts.class);                startActivity(contactsIntent);            }        });        //设置取消按钮点击事件        dialog.setNegativeButton("取消", null);        //显示对话框        dialog.show();    }}

然后是获取某个手机号码的归属地

/** * Created by lee on 2016/10/25. */public class LocationActivity extends Activity{    /**     * 初始化控件     * */    private TextView province, city, supplier, suit;    private Button query;    private EditText phoneNumber;    /**     * handler     * */    private android.os.Handler handler = new android.os.Handler(){        public void handleMessage(Message message){            String[] result = (String[])message.obj;            String supplierName = result[0];            String provinceName = result[1];            String cityName = result[2];            String suitName = result[3];            //更新ui            province.setText(provinceName);            city.setText(cityName);            supplier.setText(supplierName);            suit.setText(suitName);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_phone_number);        province = (TextView) findViewById(R.id.province);        city = (TextView)findViewById(R.id.city);        supplier = (TextView)findViewById(R.id.supplier);        suit = (TextView)findViewById(R.id.suit);        query = (Button)findViewById(R.id.query);        phoneNumber = (EditText)findViewById(R.id.phone_number);        /**         * 手机号码         * */        final String number = getIntent().getStringExtra("number");        /**         * 显示归属地         * */        phoneNumber.setText(number);        queryPhoneNumberLocation(number);        /**         * 点击之后查询         * */        query.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String number = String.valueOf(phoneNumber.getText());                queryPhoneNumberLocation(number);            }        });    }    public void queryPhoneNumberLocation(String number){        String address = "http://apis.baidu.com/apistore/mobilenumber/mobilenumber?phone=";        if (number.length()==11){            HttpRequest.httpRequest(address + number, new HttpCallBackListener() {                @Override                public void onFinish(String response) {                    String[] result = new MyUtil().handleJSON(response);                    Message message = new Message();                    message.obj = result;                    handler.sendMessage(message);                }                @Override                public void onError(Exception e) {                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            Toast.makeText(LocationActivity.this, "查询失败", Toast.LENGTH_SHORT).show();                        }                    });                }            });        }else{            province.setText("请输入正确的手机号码!");            city.setText("");            supplier.setText("");            suit.setText("");        }    }}

然后是HttpConnection,连接服务器,获取某个号码的归属地

/** * Created by lee on 2016/10/25. */public class HttpRequest {    public static void httpRequest(final String address, final HttpCallBackListener listener){        new Thread(new Runnable() {            @Override            public void run() {                URL url;                HttpURLConnection connection = null;                try {                    url = new URL(address);                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setRequestProperty("apikey", "a7146a37e0da2251ab00d9ea7c64cd66");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    InputStream inputStream = connection.getInputStream();                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));                    String line = null;                    StringBuilder response = new StringBuilder();                    while((line = bufferedReader.readLine())!=null){                        response.append(line);                    }                    if (listener != null){                        listener.onFinish(response.toString());                    }                } catch (Exception e) {                    if (listener!=null){                        listener.onError(e);                    }                } finally {                    connection.disconnect();                }            }        }).start();    }}

然后是HttpCallBackListener接口,回调机制

public interface HttpCallBackListener {    public void onFinish(String response);    public void onError(Exception e);}

然后是工具类,对服务器返回的json数据进行解析

/** * Created by lee on 2016/10/25. */public class MyUtil {    public String[] handleJSON(String response){        String[] array = null;        try {            JSONObject jsonObject = new JSONObject(response);            JSONObject subObject = jsonObject.getJSONObject("retData");            String supplier = subObject.getString("supplier");            String province = subObject.getString("province");            String city = subObject.getString("city");            String suit = subObject.getString("suit");            array = new String[]{supplier,province,city,suit};        } catch (JSONException e) {            e.printStackTrace();        }        return  array;    }}

接下来就是界面
首先是展示所有联系人的一个界面,通过listview展示

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".Contacts"    android:orientation="vertical">    <LinearLayout        android:paddingTop="15dp"        android:paddingBottom="15dp"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <EditText            android:id="@+id/serch"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="8"            android:paddingLeft="10dp"/>        <Button            android:id="@+id/bt_serch"            android:layout_width="0dp"            android:layout_height="40dp"            android:layout_weight="2"            android:text="搜索"            android:paddingLeft="10dp"/>    </LinearLayout>    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:paddingLeft="20dp"></ListView></LinearLayout>

然后是具体展示某个联系人相信信息的界面。这个界面控件有点多,因为不仅仅要展示信息,通过编辑按钮,还要编辑信息。

<?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">    <ImageView        android:id="@+id/iv_icon"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:gravity="center"        android:paddingTop="10dp"/>    <ImageView        android:id="@+id/edit_icon"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        android:gravity="center"        android:paddingTop="10dp"        android:visibility="gone"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"></LinearLayout>    <LinearLayout        android:id="@+id/linera_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingTop="10dp">        <ImageView            android:layout_width="40dp"            android:layout_height="40dp"            android:background="@drawable/name"            android:paddingLeft="20dp"/>        <TextView            android:id="@+id/tv_name"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:textSize="40sp"            android:paddingLeft="20dp"/>    </LinearLayout>    <LinearLayout        android:id="@+id/edit_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:visibility="gone">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="姓名:"/>        <EditText            android:id="@+id/et_name"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:paddingLeft="10dp"            android:hint="请输入姓名"/>    </LinearLayout>    <LinearLayout        android:id="@+id/linear_num"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingTop="10dp">        <ImageView            android:layout_width="40dp"            android:layout_height="40dp"            android:background="@drawable/number"            android:paddingLeft="20dp"/>        <TextView            android:id="@+id/tv_num"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:textSize="30sp"            android:paddingLeft="20dp"/>        <Button            android:id="@+id/serch_location"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="归属地"            android:gravity="center"/>    </LinearLayout>    <LinearLayout        android:id="@+id/edit_num"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:visibility="gone">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="号码:"/>        <EditText            android:id="@+id/et_num"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:paddingLeft="10dp"            android:hint="请输入号码"/>    </LinearLayout>    <LinearLayout        android:id="@+id/linear_email"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingTop="10dp">        <ImageView            android:layout_width="40dp"            android:layout_height="40dp"            android:background="@drawable/email"            android:paddingLeft="20dp"/>        <TextView            android:id="@+id/tv_email"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:textSize="30sp"            android:paddingLeft="20dp"/>    </LinearLayout>    <LinearLayout        android:id="@+id/edit_email"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:visibility="gone">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="邮箱:"/>        <EditText            android:id="@+id/et_email"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:hint="请输入邮箱地址"            android:paddingLeft="10dp"/>    </LinearLayout>    <Button        android:id="@+id/bt_ok"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:visibility="gone"        android:text="确认"/>    <LinearLayout        android:id="@+id/linear_button"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingTop="20dp"        android:paddingLeft="20dp"        android:paddingRight="20dp">        <Button            android:id="@+id/bt_edit"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:textSize="20sp"            android:text="编辑"            android:paddingLeft="20dp"/>        <Button            android:id="@+id/bt_delete"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:textSize="20sp"            android:text="删除"            android:paddingLeft="20dp"            android:paddingRight="20dp"            />    </LinearLayout></LinearLayout>

然后是查询号码归属地的界面,这个界面很简单。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_height="match_parent"    android:layout_width="match_parent"    android:orientation="vertical">    <EditText        android:id="@+id/phone_number"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入要查询的手机号"        android:textSize="24sp"/>    <Button        android:id="@+id/query"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="查询"        android:textSize="24sp"/>    <TextView        android:id="@+id/province"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="24sp"/>    <TextView        android:id="@+id/city"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="24sp"/>    <TextView        android:id="@+id/supplier"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="24sp"/>    <TextView        android:id="@+id/suit"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="24sp"/></LinearLayout>

最后是各种权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.CAMERA"/>    <uses-permission android:name="android.permission.INTERNET"/>
0 0
原创粉丝点击