Android开发 ---ContentProvider数据提供者,Activity和Service就是上下文对象,短信监听器,内容观察者
1、activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:text="读取短信息" android:onClick="readSms" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="监听短信息" android:onClick="listen_Sms" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="读取联系人" android:onClick="readContact" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="读取内置存储图像" android:onClick="readInnerImage" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/userImage" android:onClick="selectImage" android:src="@mipmap/ic_launcher" android:layout_width="80dp" android:layout_height="80dp" /> <ImageView android:id="@+id/userImage2" android:onClick="selectImage2" android:src="@mipmap/ic_launcher" android:layout_width="80dp" android:layout_height="80dp" /> <ImageView android:id="@+id/userImage3" android:onClick="selectImage3" android:src="@mipmap/ic_launcher" android:layout_width="80dp" android:layout_height="80dp" /> </LinearLayout>
2、MainActivity.java
package example.nf.android_contentprovider_system1; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.ContactsContract; import android.provider.MediaStore; import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import example.nf.utils.FileUtils; import example.nf.utils.UriUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Date; public class MainActivity extends Activity { //定义一个数据提供者 private ContentResolver resolver; //定义一个短信监听器 private SmsObserver sbserver; private ImageView userImage,userImage2,userImage3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); userImage=(ImageView)findViewById(R.id.userImage); userImage2=(ImageView)findViewById(R.id.userImage2); userImage3=(ImageView)findViewById(R.id.userImage3);
//getContext().getContentResolver().insert(...)
//getContext()是获得一个上下文对象(Context),一般在四大组件中都会获取上下文对象
//在Activity和Service中,就没必要获取Context了,因为他本身就是,所以可以直接调用getContentResolver()。
//在ContentProvider中,就需要先调用getContext()获取到Context,然后调用getContentResolver() 获得ContentResolver对象,
//也就是,getContext().getContentResolver()
//即将当前Activity场景赋值给数据提供者 resolver=getContentResolver();//获取Content上下文对象数据解析器 } //读取短信息 public void readSms(View view){ /** * content://sms/inbox 收件箱 content://sms/sent 已发送 content://sms/draft 草稿 content://sms/outbox 发件箱 content://sms/failed 发送失败 content://sms/queued 待发送列表 */ readSms(Uri.parse("content://sms/inbox")); } //读取短信 private void readSms(Uri uri){ //通过数据提供者查询uri指定短信的address地址和body内容 /* * _id 一个自增字段,从1开始 thread_id 序号,同一发信人的id相同 address 发件人手机号码 person 联系人列表里的序号,陌生人为null date 发件日期 protocol 协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO read 是否阅读 0未读, 1已读 status 状态 -1接收,0 complete, 64 pending, 128 failed type ALL = 0; INBOX = 1; SENT = 2; DRAFT = 3; OUTBOX = 4; FAILED = 5; QUEUED = 6; body 短信内容 service_center 短信服务中心号码编号 subject 短信的主题 * * */
//创建一个结果集游标,通过向数据提供者的query()方法中传入短信息uri,查询出短信的号码和内容... Cursor cursor=resolver.query(uri,new String[]{"address","body"},null,null,null); //获取结果集游标的列名 String[] cols=cursor.getColumnNames(); //遍历结果集游标 while(cursor.moveToNext()){ for(int i=0;i<cols.length;i++){ //通过日志输出结果集游标里的信息 Log.i("短信息",cols[i]+"="+cursor.getString(cursor.getColumnIndex(cols[i]))); } } cursor.close(); Toast.makeText(this, "短信息已经读取完毕", Toast.LENGTH_SHORT).show(); }
//监听短信息 public void listen_Sms(View view){ Uri uri=Uri.parse("content://sms");
//实例一个短信息观察者,观察者中传入一个handler,handler专门用来跟新Ui操作 sbserver=new SmsObserver(handler);
//当数据改变时,界面更新
//注册一个短信息的内容观察者,专门观察短信特定Uri引起的数据变化情况
//监听的uri内容发生改变就会触发内容观察者
resolver.registerContentObserver(uri,true,sbserver); } private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){//获取下面的标识位 case 1:
//更新ui readSms(Uri.parse("content://sms/outbox")); break; } } }; //定义一个短信息的观察者 private class SmsObserver extends ContentObserver{ public SmsObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange);
//给上面的handler设置标识位 handler.sendEmptyMessage(1); } } //读取联系人电话 public void readContact(View view){ Uri uri=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//创建结果集游标,通过向数据提供者的query()方法中传入uri,获取联系人的名字和信息... Cursor cursor=resolver.query(uri,new String[]{"display_name","data1"},null,null,null);
//获取结果集游标的列 String[] cols=cursor.getColumnNames(); //循环遍历结果集游标
while(cursor.moveToNext()){ for (int i=0;i<cols.length;i++){ Log.i("Contact",cols[i]+"="+cursor.getString(cursor.getColumnIndex(cols[i]))); } } cursor.close(); } //读取手机内置存储图像 public void readInnerImage(View view){ Uri uri= MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cursor=resolver.query(uri,new String[]{"_data","_size","_display_name"},null,null,null); String[] cols=cursor.getColumnNames(); while(cursor.moveToNext()){ for (int i=0;i<cols.length;i++){ Log.i("Contact",cols[i]+"="+cursor.getString(cursor.getColumnIndex(cols[i]))); } } cursor.close(); } //选择图像_方法一 public void selectImage(View view){ /* Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent,1); */ /* * (一)、调用图库,获取所有本地图片: Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT); imageIntent.setType("image/*"); startActivityForResult(imageIntent, PICK_CODE); //PICK_CODE是常量 (二)、调用本地联系人: Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT); (三)、调用音乐,获取所有本地音乐文件: Intent audioIntent = new Intent(Intent.ACTION_GET_CONTENT); audioIntent.setType("audio/*"); startActivityForResult(audioIntent, PICK_AUDIO); (四)、调用视频,获取所有本地视频文件: Intent videoIntent = new Intent(Intent.ACTION_GET_CONTENT); videoIntent.setType("video/*"); startActivityForResult(videoIntent, PICK_VIDEO); * * */ //打开图像
//Intent.ACTION_PICK调用系统图库,这个6.0以后失效了
//ACTION_GET_CONTENT 4.3以上版本支持
Intent intent=new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//使用startActivityForResult()说明两个Activity之间有数据的交互,即,另一个Activity可能还有数据返回到这个页面进行处理
startActivityForResult(intent,1); } //打开相机拍照 public void selectImage2(View view){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,2); } //打开相机拍照3,存储原图 String picPath; public void selectImage3(View view) throws IOException { String basePath = Environment.getExternalStorageDirectory().getPath(); picPath=basePath+"/userImages/user_"+new Date().getTime()+".jpg"; //picPath=this.getFilesDir()+"/user_images/user_"+new Date().getTime()+".jpg"; Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file=new File(picPath); if(!file.getParentFile().exists()) file.getParentFile().mkdirs(); file.createNewFile(); Uri uri = Uri.fromFile(file); //为拍摄的图片指定一个存储的路径 intent2.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent2, 3); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case 1: Uri uri=data.getData();//取出用户选择的图片Uri try { Bitmap bitmap=MediaStore.Images.Media.getBitmap(resolver,uri); userImage.setImageBitmap(bitmap); //移动文件 String from= UriUtils.getPathFromUri(this,uri); String to=this.getFilesDir().getPath()+"/userImages"; Log.i("from:",from+""); Log.i("to:",to+""); FileUtils.copyFile(from,to); } catch (Exception e) { e.printStackTrace(); } break; case 2: Bitmap bitmap; try { bitmap = data.getExtras().getParcelable("data"); userImage2.setImageBitmap(bitmap); } catch (ClassCastException e){ e.printStackTrace(); } break; case 3: //把图片转化为字节流 InputStream fis = null; try { fis = new FileInputStream(picPath); //把流转化图片 Bitmap userImage = BitmapFactory.decodeStream(fis); userImage3.setImageBitmap(userImage); } catch (Exception e) { e.printStackTrace(); } break; } } @Override protected void onDestroy() { super.onDestroy(); if(sbserver!=null) resolver.unregisterContentObserver(sbserver); } }
3、utils/FileUtils.java
package example.nf.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; /** * Created by Administrator on 2017/12/19. */ public class FileUtils { public static void copyFile(String from,String to){ if(from!=null&&to!=null){ File fromFile=new File(from); if(fromFile.exists()){ File toFile=new File(to+"/"+fromFile.getName()); if(!toFile.getParentFile().exists()){ toFile.getParentFile().mkdirs(); } try { FileInputStream in=new FileInputStream(fromFile); FileOutputStream out=new FileOutputStream(toFile); int len=-1; byte[] bytes=new byte[1024]; while((len=in.read(bytes))!=-1){ out.write(bytes,0,len); } out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } } } }
4、utils/UriUtils.java
package example.nf.utils; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.util.Log; /** * Created by Administrator on 2017/12/19. */ public class UriUtils { public static String getPathFromUri(Context context, Uri uri){ if(uri!=null) { Cursor cursor = context.getContentResolver().query(uri, new String[]{"_data"}, null, null, null); String[] cols=cursor.getColumnNames(); if (cursor.moveToNext()) { String path=cursor.getString(cursor.getColumnIndex("_data")); return path; } cursor.close(); } return null; } }
5、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="example.nf.android_contentprovider_system1" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.CAMERA"/> </manifest>
如果您发现博客内容有什么错误,请您下方留言