1. 1.内容观察者ContentObserver
  2. 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下:
  3. private static final Uri URI = Uri.parse("content://person.db");
  4. public class PersonContentProvider extends ContentProvider {
  5. public Uri insert(Uri uri, ContentValues values) {
  6. db.insert("person", "personid", values);
  7. getContext().getContentResolver().notifyChange(uri, null);
  8. }
  9. }
  10. 如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserveronChange()方法:
  11. getContentResolver().registerContentObserver(Uri.parse("content://person.db"),
  12. true, new PersonObserver(new Handler()));
  13. public class PersonObserver extends ContentObserver{
  14. public PersonObserver(Handler handler) {
  15. super(handler);
  16. }
  17. public void onChange(boolean selfChange) {
  18. //此处可以进行相应的业务处理
  19. Toast.makeText(MainActivity.this, "数据库内容发送变化了!", 0).show();
  20. }
  21. }
  22.  
  23. .获取系统的联系人信息
  24. public void getContacts(View view) {
  25. ContentResolver resolver = this.getContentResolver();
  26. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  27. Uri dataUri = Uri.parse("content://com.android.contacts/data");
  28. Cursor cursor = resolver.query(uri, null, null, null, null);
  29. if (cursor.moveToLast()) {
  30. String id = cursor.getString(cursor.getColumnIndex("contact_id"));
  31. if (id != null) {
  32. Cursor dataCursor = resolver.query(dataUri, null,"raw_contact_id=?", new String[] { id }, null);
  33. while (dataCursor.moveToNext()) {
  34. String data1 = dataCursor.getString(dataCursor.getColumnIndex("data1"));
  35. String mimetype = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
  36. Toast.makeText(this, data1 + " = " + mimetype, 0).show();
  37. }
  38. dataCursor.close();
  39. } else {
  40. Toast.makeText(this, "空!", 0).show();
  41. }
  42. }
  43.  
  44. cursor.close();
  45. }
  46.  
  47. <uses-permission android:name="android.permission.READ_CONTACTS" />
  48.  
  49. .保存联系人到系统通讯录
  50. public void writeContact(View view) {
  51. ContentResolver resolver = this.getContentResolver();
  52. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  53. Uri dataUri = Uri.parse("content://com.android.contacts/data");
  54. Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null,
  55. null);
  56. if (cursor.moveToLast()) {
  57. int lastId = cursor.getInt(0);
  58. int newId = lastId + 1;
  59. ContentValues values = new ContentValues();
  60. values.put("contact_id", newId);
  61. resolver.insert(uri, values);
  62.  
  63. ContentValues phoneValues = new ContentValues();
  64. phoneValues.put("data1", "13500001111");
  65. phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
  66. phoneValues.put("raw_contact_id", newId);
  67. resolver.insert(dataUri, phoneValues);
  68.  
  69. ContentValues emaiValues = new ContentValues();
  70. emaiValues.put("data1", "reality_jie@qq.com");
  71. emaiValues.put("mimetype", "vnd.android.cursor.item/email_v2");
  72. emaiValues.put("raw_contact_id", newId);
  73. resolver.insert(dataUri, emaiValues);
  74. ContentValues nameValues = new ContentValues();
  75. nameValues.put("data1", "weijie");
  76. nameValues.put("mimetype", "vnd.android.cursor.item/name");
  77. nameValues.put("raw_contact_id", newId);
  78. resolver.insert(dataUri, nameValues);
  79. }
  80. cursor.close();
  81. Toast.makeText(this, "保存成功", 0).show();
  82.  
  83. }
  84.  
  85. <uses-permission android:name="android.permission.WRITE_CONTACTS" />
  86.  
  87. .网络图片查看器
  88. public class MainActivity extends Activity {
  89.  
  90. protected static final int UPDATE_UI = 1;
  91. protected static final int ERROR = 2;
  92. private ImageView iv_beauty;
  93. private EditText et_path;
  94.  
  95. // 主线程创建消息处理器
  96. Handler handler = new Handler() {
  97. @Override
  98. public void handleMessage(Message msg) {
  99. if (msg.what == UPDATE_UI) {
  100. iv_beauty.setImageBitmap((Bitmap) msg.obj);
  101. } else {
  102. Toast.makeText(getApplicationContext(), "图片获取失败!", 0)
  103. .show();
  104. }
  105. }
  106. };
  107.  
  108. @Override
  109. protected void onCreate(Bundle savedInstanceState) {
  110. super.onCreate(savedInstanceState);
  111. setContentView(R.layout.activity_main);
  112. this.iv_beauty = (ImageView) this.findViewById(R.id.iv_beauty);
  113. this.et_path = (EditText) this.findViewById(R.id.et_path);
  114. }
  115.  
  116. public void watch(View view) {
  117. final String path = this.et_path.getText().toString().trim();
  118. if (TextUtils.isEmpty(path)) {
  119. Toast.makeText(this, "路径不能为空", 0).show();
  120. } else {
  121. new Thread() {
  122. @Override
  123. public void run() {
  124. try {
  125. URL url = new URL(path);
  126. HttpURLConnection connection = (HttpURLConnection) url
  127. .openConnection();
  128. // 设置请求方式
  129. connection.setRequestMethod("GET");
  130. // 设置超时时间
  131. connection.setConnectTimeout(10000);
  132.  
  133. // connection.setRequestProperty(field, newValue)
  134.  
  135. int code = connection.getResponseCode();
  136. if (code == 200) {
  137. InputStream is = connection.getInputStream();
  138. Bitmap bitmap = BitmapFactory.decodeStream(is);
  139.  
  140. // 告诉主线程一个消息,帮我更新ui,内容:bitmap
  141. Message msg = new Message();
  142. msg.what = UPDATE_UI;
  143. msg.obj = bitmap;
  144. handler.sendMessage(msg);
  145. } else {
  146. Message msg = new Message();
  147. msg.what = ERROR;
  148. handler.sendMessage(msg);
  149. }
  150. } catch (Exception e) {
  151. e.printStackTrace();
  152. Message msg = new Message();
  153. msg.what = ERROR;
  154. handler.sendMessage(msg);
  155. }
  156. }
  157.  
  158. }.start();
  159.  
  160. }
  161. }
  162. }
  163.  
  164. .网络html查看器
  165. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  166. xmlns:tools="http://schemas.android.com/tools"
  167. android:layout_width="match_parent"
  168. android:layout_height="match_parent"
  169. android:orientation="vertical"
  170. tools:context=".MainActivity" >
  171.  
  172. <EditText
  173. android:id="@+id/et_path"
  174. android:layout_width="match_parent"
  175. android:layout_height="wrap_content"
  176. android:hint="请输入网址" />
  177.  
  178. <Button
  179. android:layout_width="match_parent"
  180. android:layout_height="wrap_content"
  181. android:hint="确定"
  182. android:onClick="click" />
  183.  
  184. <ScrollView
  185. android:layout_width="match_parent"
  186. android:layout_height="match_parent" >
  187.  
  188. <TextView
  189. android:id="@+id/tv_content"
  190. android:layout_width="wrap_content"
  191. android:layout_height="wrap_content" />
  192. </ScrollView>
  193.  
  194. </LinearLayout>
  195.  
  196. public class MainActivity extends Activity {
  197.  
  198. protected static final int ERROR = 0;
  199. protected static final int SHOW_CONTENT = 1;
  200. private EditText et_path;
  201. private TextView tv_content;
  202.  
  203. private Handler handler = new Handler() {
  204. public void handleMessage(android.os.Message msg) {
  205. switch (msg.what) {
  206. case ERROR:
  207. Toast.makeText(MainActivity.this, "获取网页信息失败",
  208. Toast.LENGTH_SHORT).show();
  209. break;
  210. case SHOW_CONTENT:
  211. tv_content.setText((String) msg.obj);
  212. break;
  213. }
  214.  
  215. };
  216.  
  217. };
  218.  
  219. @Override
  220. protected void onCreate(Bundle savedInstanceState) {
  221. super.onCreate(savedInstanceState);
  222. setContentView(R.layout.activity_main);
  223. this.et_path = (EditText) this.findViewById(R.id.et_path);
  224. this.tv_content = (TextView) this.findViewById(R.id.tv_content);
  225. }
  226.  
  227. public void click(View view) {
  228. final String path = this.et_path.getText().toString().trim();
  229. if (TextUtils.isEmpty(path)) {
  230. Toast.makeText(this, "路径不能为空!", Toast.LENGTH_SHORT).show();
  231. } else {
  232. new Thread() {
  233.  
  234. public void run() {
  235. try {
  236. URL url = new URL(path);
  237. HttpURLConnection conn = (HttpURLConnection) url
  238. .openConnection();
  239. conn.setRequestMethod("GET");
  240. conn.setReadTimeout(5000);
  241. int code = conn.getResponseCode();
  242. if (code == 200) {
  243. InputStream is = conn.getInputStream();
  244. String result = StreamTool.readInputStream(is);
  245. Message msg = new Message();
  246. msg.what = SHOW_CONTENT;
  247. msg.obj = result;
  248. handler.sendMessage(msg);
  249. } else {
  250. Message msg = new Message();
  251. msg.what = ERROR;
  252. handler.sendMessage(msg);
  253. }
  254. } catch (Exception e) {
  255. e.printStackTrace();
  256. Message msg = new Message();
  257. msg.what = ERROR;
  258. handler.sendMessage(msg);
  259. }
  260. };
  261.  
  262. }.start();
  263. }
  264. }
  265.  
  266. }
  267.  
  268. public class StreamTool {
  269.  
  270. public static String readInputStream(InputStream is) {
  271. try {
  272.  
  273. ByteArrayOutputStream out = new ByteArrayOutputStream();
  274. int length = 0;
  275. byte[] buffer = new byte[];
  276. if ((length = is.read(buffer)) != -1) {
  277. out.write(buffer, 0, length);
  278. }
  279. byte[] result = out.toByteArray();
  280. String temp = new String(result);//默认utf-8
  281. if(temp.contains("gb2312")){
  282. return new String(result,"gb2312");
  283. }
  284. return temp;
  285. } catch (Exception e) {
  286. // TODO: handle exception
  287. }
  288. return "转换失败";
  289. }
  290.  
  291. }
  292.  
  293. <uses-permission android:name="android.permission.INTERNET"/>
  294.  
  295. 6.使用异步框架Android-Async-Http
  296. 1、下载:https://github.com/loopj/android-async-http
  297. 2、在工程中加入jar包,或直接把源文件加到工程中
  298. 3android-async-http文档:http://loopj.com/android-async-http/
  299.  
  300. AsyncHttp使用回调的方法处得请求的结果。
  301.  
  302. AsyncHttpClient client = new AsyncHttpClient();
  303. client.get("http://www.google.com", new AsyncHttpResponseHandler() {
  304. @Override
  305. public void onSuccess(String response) {
  306. System.out.println(response);
  307. }
  308. });
  309.  
  310. 最好建一个静态的AsyncHttpClient
  311.  
  312. public class HttpUtil {
  313.  
  314. private static AsyncHttpClient client = new AsyncHttpClient(); // 实例话对象
  315.  
  316. static {
  317.  
  318. client.setTimeout(10000); // 设置链接超时,如果不设置,默认为10s
  319. }
  320.  
  321. // 用一个完整url获取一个string对象
  322. public static void get(String urlString, AsyncHttpResponseHandler res)
  323. {
  324.  
  325. client.get(urlString, res);
  326.  
  327. }
  328.  
  329. // url里面带参数
  330. public static void get(String urlString, RequestParams params,
  331. AsyncHttpResponseHandler res){
  332.  
  333. client.get(urlString, params, res);
  334.  
  335. }
  336.  
  337. // 不带参数,获取json对象或者数组
  338. public static void get(String urlString, JsonHttpResponseHandler res) {
  339. client.get(urlString, res);
  340.  
  341. }
  342.  
  343. // 带参数,获取json对象或者数组
  344. public static void get(String urlString, RequestParams params,
  345. JsonHttpResponseHandler res) {
  346.  
  347. client.get(urlString, params, res);
  348.  
  349. }
  350.  
  351. // 下载数据使用,会返回byte数据
  352. public static void get(String uString, BinaryHttpResponseHandler bHandler) {
  353.  
  354. client.get(uString, bHandler);
  355.  
  356. }
  357.  
  358. public static AsyncHttpClient getClient(){
  359.  
  360. return client;
  361. }
  362.  
  363. }
  364.  
  365. 下载:
  366.  
  367. public void downloadClick(View view) {
  368. String url = "http://f.hiphotos.baidu.com/album/w%3D2048/sign=38c43ff7902397ddd6799f046dbab3b7/9c16fdfaaf51f3dee973bf7495eef01f3b2979d8.jpg";
  369. HttpUtil.get(url, new BinaryHttpResponseHandler() {
  370. @Override
  371. public void onSuccess(byte[] arg0) {
  372. super.onSuccess(arg0);
  373. File file = Environment.getExternalStorageDirectory();
  374. File file2 = new File(file, "cat");
  375. file2.mkdir();
  376. file2 = new File(file2, "cat.jpg");
  377. try {
  378. FileOutputStream oStream = new FileOutputStream(file2);
  379. oStream.write(arg0);
  380. oStream.flush();
  381. oStream.close();
  382. textView.setText("可爱的猫咪已经保存在sdcard里面");
  383. } catch (Exception e) {
  384. e.printStackTrace();
  385. Log.i("hck", e.toString());
  386. }
  387. }
  388. });
  389. }
  390.  
  391. 上传:
  392. public void uploadClick(View view){
  393. String path="http://10.0.2.2:8080/jsontest/servlet/UploadServlet";
  394. File myFile = new File("/sdcard/cat/cat.jpg");
  395. RequestParams params = new RequestParams();
  396. try {
  397. params.put("filename", myFile);
  398.  
  399. AsyncHttpClient client = new AsyncHttpClient();
  400. client.post(path, params, new AsyncHttpResponseHandler(){
  401.  
  402. @Override
  403. public void onSuccess(int statusCode, String content) {
  404. // TODO Auto-generated method stub
  405. super.onSuccess(statusCode, content);
  406. Toast.makeText(MainActivity.this, "上传成功!", Toast.LENGTH_LONG).show();
  407. }
  408.  
  409. });
  410.  
  411. } catch(FileNotFoundException e) {
  412.  
  413. }
  414. }

无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)的更多相关文章

  1. android API版本对应的系统版本及Android获取手机和系统版本等信息的代码

    学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...

  2. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...

  3. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电

    Activity public class MainActivity extends ListActivity {     private TextView tv_info;     private  ...

  4. Android 利用内容观察者实现短信窃听

    <Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...

  5. [android] 获取系统的联系人信息

    内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者. 找到/data/data/com.android.providers.contacts/contacts2.db ...

  6. Android获取手机和系统版本等信息的代码

    有时候需要统计手机的型号和版本号,利用程序可以获取到相应的手机信息,对比两部手机发现,厂商不同,某个信息显示方式也不尽相同,具体见: String phoneInfo = "Product: ...

  7. Android_(控件)使用ListView显示Android系统中联系人信息

    使用ListView显示手机中联系人的姓名和电话号码 父类布局activity_main.xml,子类布局line.xml(一个文件的单独存放) 运行截图: (避免泄露信息对部分地方进行了涂鸦O(∩_ ...

  8. Android中内容观察者的使用---- ContentObserver类详解

    详解:http://blog.csdn.net/qinjuning/article/details/7047607

  9. Android 之内容提供者 内容解析者 内容观察者

    contentProvider:ContentProvider在Android中的作用是对外提供数据,除了可以为所在应用提供数据外,还可以共享数据给其他应用,这是Android中解决应用之间数据共享的 ...

随机推荐

  1. 跟着百度学PHP[4]OOP面对对象编程-12-抽象类

    什么是抽象方法?我们在类里面定义的没有方法体的方法就是抽象方法.所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个 ...

  2. PHP中面相对象对象的知识点整理

    面向对象 万物皆对象,将构成问题的事务分解到各个对象上,建立对象的目的不是为了完成一个工作,而是为了描述某个事务在解决问题中的行为,更符合人的思维习惯,代码重用性高,可扩展性. ___________ ...

  3. 编写Delphi控件属性Stored和Default的理解及应用

    property ButtonSize: Integer read FButtonSize write SetButtonSize default 0;    property Color: TCol ...

  4. 2016年10月10日--穷举、迭代、while循环

    穷举 将所有可能性全部全部走一遍,使用IF筛选出满足的情况 练习: 1.单位给发了一张150元购物卡, 拿着到超市买三类洗化用品. 洗发水15元,香皂2元,牙刷5元. 求刚好花完150元,有多少种买法 ...

  5. java中类名,方法,变量,包名等大小写命名规范

    类名:首字母大写,其他单词中首字母大写,其他小写方法名:首字母小写,其他单词中首字母大写,其他小写变量:与方法名规则同包名:全部小写接口interface:I开头

  6. minigui交叉编译整理

    简介 MiniGUI 是一款面向嵌入式系统的高级窗口系统(Windowing System)和图形用户界面(Graphical User Interface,GUI)支持系统,由魏永明先生于 1998 ...

  7. TIMIT语音库

    TIMIT语音库有着准确的音素标注,因此可以应用于语音分割性能评价,同时该数据库又含有几百个说话人语音,所以也是评价说话人识别常用的权威语音库,但该语音库的商业用途是要花钱买的.下面的资源来自与MIT ...

  8. POCO浅探

    POCO作用类似于POJO.POJO的内在含义是指那些从来没有任何类继承.也没有实现任何接口,更是没有被其他框架侵入的JAVA对象.POCO的含义与此是一致的.POJO的意义就在于它的简单灵活性,能够 ...

  9. 转: Oracle表空间查询

    1.查询数据库中的表空间名称 1)查询所有表空间 select tablespace_name from dba_tablespaces; select tablespace_name from us ...

  10. wireshark 和 Httpwatch tcpdump

    wireshark 功能强大,适用性高.过滤功能好. Httpwatch 功能单一,优缺点明显,但是非常适合抓取http交互的包,而且可以非常明确的显示出整个的交互过程. tcpdump linux ...