Android中8个常用的操作

来源:互联网 发布:淘宝客定向计划是什么 编辑:程序博客网 时间:2024/06/03 19:42

1.Android EditText的输入监听,输入字符的动态获取

有时候我们可能会用到时时的监听EditText输入字符的时时监听,监听字符的个数,做一些正则表达式的处理等。如下方法可以实现:

我做的是时时的把EditeText输入的数据同步到TextView上

布局文件:

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/textview"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_centerHorizontal="true"  
  11.         android:layout_centerVertical="true"  
  12.         android:padding="@dimen/padding_medium"  
  13.         tools:context=".Test02Activity" />  
  14.   
  15.     <EditText  
  16.         android:id="@+id/editText1"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignLeft="@+id/textview"  
  20.         android:layout_below="@+id/textview"  
  21.         android:layout_marginTop="31dp"  
  22.         >  
  23.   
  24.         <requestFocus />  
  25.     </EditText>  
  26.   
  27. </RelativeLayout>  

java代码:

[html] view plaincopy
  1. package com.example.testdemo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.util.Log;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. import android.widget.EditText;  
  9. import android.widget.TextView;  
  10. import android.support.v4.app.NavUtils;  
  11. import android.text.Editable;  
  12. import android.text.TextWatcher;  
  13.   
  14. public class Test02Activity extends Activity {  
  15.     private static final String TAG"Test";  
  16.     private EditText mEditText;  
  17.     private TextView mTextView;  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_test02);  
  22.         mEditText = (EditText) findViewById(R.id.editText1);  
  23.         mTextView = (TextView) findViewById(R.id.textview);  
  24.           
  25.         mEditText.addTextChangedListener(new TextWatcher(){  
  26.   
  27.             @Override  
  28.             public void afterTextChanged(Editable s) {  
  29.                 Log.d(TAG, "afterTextChanged");  
  30.             }  
  31.   
  32.             @Override  
  33.             public void beforeTextChanged(CharSequence s, int start, int count,  
  34.                     int after) {  
  35.                 Log.d(TAG, "beforeTextChanged:" + s + "-" + start + "-" + count + "-" + after);  
  36.                   
  37.             }  
  38.   
  39.             @Override  
  40.             public void onTextChanged(CharSequence s, int start, int before,  
  41.                     int count) {  
  42.                 Log.d(TAG, "onTextChanged:" + s + "-" + "-" + start + "-" + before + "-" + count);  
  43.                 mTextView.setText(s);  
  44.             }  
  45.               
  46.         });  
  47.     }  
  48.   
  49.     @Override  
  50.     public boolean onCreateOptionsMenu(Menu menu) {  
  51.         getMenuInflater().inflate(R.menu.activity_test02, menu);  
  52.         return true;  
  53.     }  
  54.   
  55.       
  56. }  


2.Android读取并备份用户短信(xml方式)

清单文件中需要加入两个权限:



MainActivity实现:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.mth.readMessage;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import org.xmlpull.v1.XmlSerializer;  
  6. import android.app.Activity;  
  7. import android.content.ContentResolver;  
  8. import android.database.Cursor;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.os.Environment;  
  12. import android.util.Xml;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.Toast;  
  17.   
  18. /** 
  19.  * 说明: 本程序的目的是通过创建xml文件在sd卡上 
  20.  *      完成短信的备份 
  21.  *  
  22.  */  
  23. public class MainActivity extends Activity {  
  24.     private Button read_message;  
  25.     // 短信备份的文件对象  
  26.     private File smsBackUpFile;  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.   
  33.         read_message = (Button) findViewById(R.id.read);  
  34.         read_message.setOnClickListener(new OnClickListener() {  
  35.   
  36.             @Override  
  37.             public void onClick(View arg0) {  
  38.                 try {  
  39.                     /* 
  40.                      * 创建一个存储备份短信的文件对象 (在sd卡上面创建一个叫sms.xml的文件对象) 
  41.                      */  
  42.                     smsBackUpFile = new File(Environment  
  43.                             .getExternalStorageDirectory(), "sms.xml");  
  44.                     // 创建一个xml文件的生成器  
  45.                     XmlSerializer xmlSerializer = Xml.newSerializer();  
  46.                     // 完成序列化器初始操作  
  47.                     FileOutputStream out = new FileOutputStream(smsBackUpFile);  
  48.                     xmlSerializer.setOutput(out, "utf-8");  
  49.   
  50.                     // 内容提供者。  
  51.                     ContentResolver resolver = getContentResolver();  
  52.                     /* 
  53.                      * uri 查询什么样的路径(短信的路径)  
  54.                      * projection 获取数据中的哪几列数据  
  55.                      * selection  selectionArgs sortOrder 查询条件 可以都写null 
  56.                      */  
  57.                     // 游标(结果集)  
  58.                     Cursor cursor = resolver.query(Uri.parse("content://sms"),  
  59.                             new String[] { "address""date""type""body" },  
  60.                             nullnullnull);  
  61.   
  62.                     /** 
  63.                      * 生成的xml文件格式 
  64.                      *  <smss>  
  65.                      *      <sms>  
  66.                      *          <address>110</address> 
  67.                      *          <body>nihao a</body>  
  68.                      *          <date>时间</date>  
  69.                      *          <type>类型</type> 
  70.                      *  </sms> 
  71.                      *  </smss> 
  72.                      */  
  73.   
  74.                     /** 
  75.                      * 生成xml文件的头 
  76.                      */  
  77.                     xmlSerializer.startDocument("utf-8"true);  
  78.                     /** 
  79.                      * 生成根节点 
  80.                      */  
  81.                     xmlSerializer.startTag(null"smss");  
  82.                     while (cursor.moveToNext()) {  
  83.                         xmlSerializer.startTag(null"sms");  
  84.                         String address = cursor.getString(0);  
  85.                         String date = cursor.getString(1);  
  86.                         String type = cursor.getString(2);  
  87.                         String body = cursor.getString(3);  
  88.                         /** 
  89.                          * 地址 
  90.                          */  
  91.                         xmlSerializer.startTag(null"address");  
  92.                         xmlSerializer.text(address);  
  93.                         xmlSerializer.endTag(null"address");  
  94.                         /** 
  95.                          * date 
  96.                          */  
  97.                         xmlSerializer.startTag(null"date");  
  98.                         xmlSerializer.text(date);  
  99.                         xmlSerializer.endTag(null"date");  
  100.                         /** 
  101.                          * body 
  102.                          */  
  103.                         xmlSerializer.startTag(null"body");  
  104.                         xmlSerializer.text(body);  
  105.                         xmlSerializer.endTag(null"body");  
  106.                         /** 
  107.                          * type 
  108.                          */  
  109.                         xmlSerializer.startTag(null"type");  
  110.                         xmlSerializer.text(type);  
  111.                         xmlSerializer.endTag(null"type");  
  112.   
  113.                         xmlSerializer.endTag(null"sms");  
  114.                     }  
  115.                     cursor.close();  
  116.                     /** 
  117.                      * 根节点配对 
  118.                      */  
  119.                     xmlSerializer.endTag(null"smss");  
  120.                     /** 
  121.                      * 生成文档的结尾 
  122.                      */  
  123.                     xmlSerializer.endDocument();  
  124.                     /** 
  125.                      * 关闭输出流 
  126.                      */  
  127.                     out.close();  
  128.                     Toast.makeText(getApplicationContext(), "短信备份成功!",  
  129.                             Toast.LENGTH_LONG).show();  
  130.                 } catch (Exception e) {  
  131.                     // TODO Auto-generated catch block  
  132.                     e.printStackTrace();  
  133.                 }  
  134.             }  
  135.         });  
  136.     }  
  137. }  

3.android电源管理PowerManager

PowerManager这个类提供了电源管理的一些功能,比如可以让屏幕或者键盘亮起来等。还有对设备的重启的api

官网是这么解释的

PowerManager Class Overview


这个类提供了控制设备电源状态的管理功能。

设备的电池的持续时间(寿命)会受到使用这个API的重要影响。在非必要的情况下不要使用WakeLock,即使必须使用,也要最低限度使用这个api,使用完之后应确保立即释放掉。

通过 Context.getSystemService()获得PowerManager的实例。

使用PowerManager的实例去获得一个WakeLock对象,使用这个方法:newWakeLock() 创建一个PowerManager.WakeLock 对象.使用WakeLock对象可以去管理设备电源的状态,使用方法特别简单:如下例子

<span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">PowerManager</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> pm </span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">PowerManager</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> getSystemService</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">POWER_SERVICE</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">  </span><span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">PowerManager</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">WakeLock</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> wl </span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> pm</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">newWakeLock</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 0, 102);">PowerManager</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">SCREEN_DIM_WAKE_LOCK</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);"> </span><span class="str" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 136, 0);">"My Tag"</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">  wl</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">acquire</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">();</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">  //在释放之前,屏幕一直亮着(有可能会变暗,但是还可以看到屏幕内容)</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">  wl</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">release</span><span class="pun" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(102, 102, 0);">();</span><span class="pln" style="padding: 0px; margin: 0px; line-height: 25.200000762939453px; color: rgb(0, 0, 0);">  </span>

下面定义的这些标记不同程度的影响系统电源。这些标记都是独占的,并且每次只能指定其中一个。

Flag ValueCPUScreenKeyboardPARTIAL_WAKE_LOCKOn*Off(关闭)Off(关闭)SCREEN_DIM_WAKE_LOCKOnDim(变暗)Off(关闭)SCREEN_BRIGHT_WAKE_LOCKOnBright(高亮)Off(关闭)FULL_WAKE_LOCKOnBright(高亮)Bright(高亮)

如果你使用的是局部唤醒锁的话(使用PARTIAL_WAKE_LOCK标志),CPU会继续运行,将忽略任何的计时器,甚至按下电源按钮。其他的唤醒锁话,CPU也会继续运转,但是使用者仍然可以按电源按钮让设备睡眠。

另外,你可以使用两个以上的标记,但是他只影响屏幕的行为。和 PARTIAL_WAKE_LOCK 同时使用的话,没有任何影响。

Flag ValueDescriptionACQUIRE_CAUSES_WAKEUPNormal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.正常情况下是不会是屏幕等变亮,相反,当获得wakeLock之后需要一个触发事件才会使屏幕或者键盘变亮。典型应用是一个对用户来说比较重要的通知时,使用这个锁。ON_AFTER_RELEASEIf this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.帮忙翻译一下吧最后啰嗦一句,这个电源管理是activity级别的。

 


一个小例子

package com.example.powers;import android.os.Bundle;import android.os.PowerManager;import android.os.PowerManager.WakeLock;import android.app.Activity;import android.content.Context;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.support.v4.app.NavUtils;public class MainActivity extends Activity {private WakeLock wakeLock;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onResume() {super.onResume();// 开始获得唤醒锁acquireWakeLock();}@Overridepublic void finish() {super.finish();// 释放锁releaseWakeLock();}private void acquireWakeLock() {if (wakeLock == null) {Log.d("debug", "Acquiring wake lock");PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass().getCanonicalName());wakeLock.acquire();}}private void releaseWakeLock() {if (wakeLock != null && wakeLock.isHeld()) {wakeLock.release();wakeLock = null;}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}


4.android中解析服务器发过来的JSON数据

解析JSON的效率要比xml高很多,建议在开发中,数据不是很复杂就用JSON传输数据
[java] view plaincopy
  1. public class VideoService {  
  2.     public List<Video> getJsonVieos() throws IOException, JSONException{  
  3.         String path = "http://111.14.19.37:8080/vidoe/video/list.do?format=json";  
  4.         URL url = new URL(path);  
  5.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  6.         conn.setConnectTimeout(5 * 1000);  
  7.         conn.setRequestMethod("GET");  
  8.         InputStream is = conn.getInputStream();  
  9.         byte[] data = InputStreamUtil.getByteArray(is);//用自己写的工具类把流转成byte数组  
  10.         String json = new String(data);  
  11.         JSONArray array = new JSONArray(json);  
  12.         List<Video> videos = new ArrayList<Video>();  
  13.         for(int i = 0; i<array.length(); i++){  
  14.             JSONObject jo = array.getJSONObject(i);  
  15.             int id = jo.getInt("id");  
  16.             String title = jo.getString("title");  
  17.             int timelength = jo.getInt("timelength");  
  18.             videos.add(new Video(id, title, timelength));  
  19.         }  
  20.         return videos;  
  21.     }  
  22. }  



5.Post方式发送http请求


[java] view plaincopy
  1. public boolean uploadPostMethod(String path, Map<String, String> params) throws IOException{  
  2.         StringBuilder sb = new StringBuilder();  
  3.         for(Map.Entry<String, String> entry : params.entrySet()){  
  4.             //sb.append(entry.getKey()).append('=').append(entry.getValue()).append('&');  
  5.             sb.append(entry.getKey()).append('=').append(URLEncoder.encode(entry.getValue(), "UTF-8")).append('&');  
  6.         }  
  7.         sb.deleteCharAt(sb.length() - 1);  
  8.         byte[] entitydata = sb.toString().getBytes();  
  9.         URL url = new URL(path);  
  10.         HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  11.         conn.setConnectTimeout(5 * 1000);  
  12.         conn.setRequestMethod("POST");  
  13.         conn.setDoOutput(true);  
  14.         conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");  
  15.         conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));  
  16.         OutputStream os = conn.getOutputStream();  
  17.         os.write(entitydata);  
  18.         os.flush();  
  19.         os.close();  
  20.         if(conn.getResponseCode() == 200){  
  21.             return true;  
  22.         }  
  23.         return false;  
  24.     }  





6.android使用http协议实现文件的上传

http协议上传文件一般最大是2M,比较适合上传小于两M的文件

下面是封装的一个文件类:

[java] view plaincopy
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.InputStream;  
  5.   
  6. /** 
  7.  * 上传的文件 
  8.  */  
  9. public class FormFile {  
  10.     /* 上传文件的数据 */  
  11.     private byte[] data;  
  12.     private InputStream inStream;  
  13.     private File file;  
  14.     /* 文件名称 */  
  15.     private String filname;  
  16.     /* 请求参数名称*/  
  17.     private String parameterName;  
  18.     /* 内容类型 */  
  19.     private String contentType = "application/octet-stream";  
  20.     /** 
  21.      *  
  22.      * @param filname 文件名称 
  23.      * @param data 上传的文件数据 
  24.      * @param parameterName 参数 
  25.      * @param contentType 内容类型 
  26.      */  
  27.     public FormFile(String filname, byte[] data, String parameterName, String contentType) {  
  28.         this.data = data;  
  29.         this.filname = filname;  
  30.         this.parameterName = parameterName;  
  31.         if(contentType!=nullthis.contentType = contentType;  
  32.     }  
  33.     /** 
  34.      *  
  35.      * @param filname 文件名 
  36.      * @param file 上传的文件 
  37.      * @param parameterName 参数 
  38.      * @param contentType 内容内容类型 
  39.      */  
  40.     public FormFile(String filname, File file, String parameterName, String contentType) {  
  41.         this.filname = filname;  
  42.         this.parameterName = parameterName;  
  43.         this.file = file;  
  44.         try {  
  45.             this.inStream = new FileInputStream(file);  
  46.         } catch (FileNotFoundException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         if(contentType!=nullthis.contentType = contentType;  
  50.     }  
  51.       
  52.     public File getFile() {  
  53.         return file;  
  54.     }  
  55.   
  56.     public InputStream getInStream() {  
  57.         return inStream;  
  58.     }  
  59.   
  60.     public byte[] getData() {  
  61.         return data;  
  62.     }  
  63.   
  64.     public String getFilname() {  
  65.         return filname;  
  66.     }  
  67.   
  68.     public void setFilname(String filname) {  
  69.         this.filname = filname;  
  70.     }  
  71.   
  72.     public String getParameterName() {  
  73.         return parameterName;  
  74.     }  
  75.   
  76.     public void setParameterName(String parameterName) {  
  77.         this.parameterName = parameterName;  
  78.     }  
  79.   
  80.     public String getContentType() {  
  81.         return contentType;  
  82.     }  
  83.   
  84.     public void setContentType(String contentType) {  
  85.         this.contentType = contentType;  
  86.     }  
  87.       
  88. }  

下面的方法封装的http协议上传数据:

[java] view plaincopy
  1. /** 
  2.      * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: 
  3.      *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data"> 
  4.             <INPUT TYPE="text" NAME="name"> 
  5.             <INPUT TYPE="text" NAME="id"> 
  6.             <input type="file" name="imagefile"/> 
  7.             <input type="file" name="zip"/> 
  8.          </FORM> 
  9.      * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.xxx.cn或http://192.168.1.10:8080这样的路径测试) 
  10.      * @param params 请求参数 key为参数名,value为参数值 
  11.      * @param file 上传文件 
  12.      */  
  13.     public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{       
  14.         final String BOUNDARY = "---------------------------7da2137580612"//数据分隔线  
  15.         final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志  
  16.           
  17.         int fileDataLength = 0;  
  18.         for(FormFile uploadFile : files){//得到文件类型数据的总长度  
  19.             StringBuilder fileExplain = new StringBuilder();  
  20.             fileExplain.append("--");  
  21.             fileExplain.append(BOUNDARY);  
  22.             fileExplain.append("\r\n");  
  23.             fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");  
  24.             fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");  
  25.             fileExplain.append("\r\n");  
  26.             fileDataLength += fileExplain.length();  
  27.             if(uploadFile.getInStream()!=null){  
  28.                 fileDataLength += uploadFile.getFile().length();  
  29.             }else{  
  30.                 fileDataLength += uploadFile.getData().length;  
  31.             }  
  32.         }  
  33.         StringBuilder textEntity = new StringBuilder();  
  34.         for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据  
  35.             textEntity.append("--");  
  36.             textEntity.append(BOUNDARY);  
  37.             textEntity.append("\r\n");  
  38.             textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");  
  39.             textEntity.append(entry.getValue());  
  40.             textEntity.append("\r\n");  
  41.         }  
  42.         //计算传输给服务器的实体数据总长度  
  43.         int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;  
  44.           
  45.         URL url = new URL(path);  
  46.         int port = url.getPort()==-1 ? 80 : url.getPort();  
  47.         Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);          
  48.         OutputStream outStream = socket.getOutputStream();  
  49.         //下面完成HTTP请求头的发送  
  50.         String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";  
  51.         outStream.write(requestmethod.getBytes());  
  52.         String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";  
  53.         outStream.write(accept.getBytes());  
  54.         String language = "Accept-Language: zh-CN\r\n";  
  55.         outStream.write(language.getBytes());  
  56.         String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";  
  57.         outStream.write(contenttype.getBytes());  
  58.         String contentlength = "Content-Length: "+ dataLength + "\r\n";  
  59.         outStream.write(contentlength.getBytes());  
  60.         String alive = "Connection: Keep-Alive\r\n";  
  61.         outStream.write(alive.getBytes());  
  62.         String host = "Host: "+ url.getHost() +":"+ port +"\r\n";  
  63.         outStream.write(host.getBytes());  
  64.         //写完HTTP请求头后根据HTTP协议再写一个回车换行  
  65.         outStream.write("\r\n".getBytes());  
  66.         //把所有文本类型的实体数据发送出来  
  67.         outStream.write(textEntity.toString().getBytes());           
  68.         //把所有文件类型的实体数据发送出来  
  69.         for(FormFile uploadFile : files){  
  70.             StringBuilder fileEntity = new StringBuilder();  
  71.             fileEntity.append("--");  
  72.             fileEntity.append(BOUNDARY);  
  73.             fileEntity.append("\r\n");  
  74.             fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");  
  75.             fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");  
  76.             outStream.write(fileEntity.toString().getBytes());  
  77.             if(uploadFile.getInStream()!=null){  
  78.                 byte[] buffer = new byte[1024];  
  79.                 int len = 0;  
  80.                 while((len = uploadFile.getInStream().read(buffer, 01024))!=-1){  
  81.                     outStream.write(buffer, 0, len);  
  82.                 }  
  83.                 uploadFile.getInStream().close();  
  84.             }else{  
  85.                 outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);  
  86.             }  
  87.             outStream.write("\r\n".getBytes());  
  88.         }  
  89.         //下面发送数据结束标志,表示数据已经结束  
  90.         outStream.write(endline.getBytes());  
  91.           
  92.         BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  93.         if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败  
  94.             return false;  
  95.         }  
  96.         outStream.flush();  
  97.         outStream.close();  
  98.         reader.close();  
  99.         socket.close();  
  100.         return true;  
  101.     }  
  102.       
  103.     /**  
  104.      * 提交数据到服务器  
  105.      * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.xxx.cn或http://192.168.1.10:8080这样的路径测试)  
  106.      * @param params 请求参数 key为参数名,value为参数值  
  107.      * @param file 上传文件  
  108.      */  
  109.     public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{  
  110.        return post(path, params, new FormFile[]{file});  
  111.     } 



7.android 从internet获取html,图片

在清单文件中加上网络访问权限

<!-- 访问internet权限 -->

<uses-permissionandroid:name="android.permission.INTERNET"/>

 

利用HttpURLConnection对象,我们可以从网络中获取网页数据.

URL url = newURL("http://www.sohu.com");

HttpURLConnection conn= (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5*1000);//设置连接超时

conn.setRequestMethod(“GET”);//get方式发起请求

if(conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");

InputStream is =conn.getInputStream();//得到网络返回的输入流

Stringresult = readData(is, "GBK");

conn.disconnect();

//第一个参数为输入流,第二个参数为字符集编码

public static StringreadData(InputStream inSream, String charsetName) throws Exception{

ByteArrayOutputStreamoutStream = new ByteArrayOutputStream();

byte[]buffer = new byte[1024];

intlen = -1;

while((len = inSream.read(buffer)) != -1 ){

outStream.write(buffer,0, len);

}

byte[]data = outStream.toByteArray();

outStream.close();

inSream.close();

returnnew String(data, charsetName);

}

 

利用HttpURLConnection对象,我们可以从网络中获取文件数据.

URL url = newURL("http://photocdn.sohu.com/20100125/Img269812337.jpg");

HttpURLConnection conn= (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5*1000);

conn.setRequestMethod("GET");

if(conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");

InputStream is =conn.getInputStream();

readAsFile(is,"Img269812337.jpg");

public static voidreadAsFile(InputStream inSream, File file) throws Exception{

FileOutputStreamoutStream = new FileOutputStream(file);

byte[]buffer = new byte[1024];

intlen = -1;

while((len = inSream.read(buffer)) != -1 ){

outStream.write(buffer,0, len);

}

     outStream.close();

inSream.close();

}





8.Android根据Button状态(normal,focused,pressed)显示不同背景图片


Android中Button 有focused, selected, pressed 等不同状态,通过配置一个XML格式的 drawable "selector" 即可实现”在不同状态下显示不同背景图片“的功能。
1. 在res/drawable目录下添加一个xml文件,用来描述Button在不同状态下对应的不同图片。我这里给该xml文件命名为btn_background.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
           android:drawable
="@drawable/btn_pressed"
/>
<!-- pressed -->
<item android:state_focused="true"
           android:drawable
="@drawable/btn_normal"
/>
<!-- focused -->
<item android:drawable="@drawable/btn_normal"
/>
<!-- default -->
</selector>

2. 在res/layout目录下,对应的layout xml文件中,将Button的android:background属性设置为btn_background即可。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"
>
<Button  
    
android:layout_width="wrap_content" 
    android:layout_height
="wrap_content" 
    android:background
="@drawable/btn_background"
/>
</LinearLayout>


3.运行结果

默认状态(unselected)

点击状态(pressed)
0 0
原创粉丝点击