1、activity_main.xml 2、MainActivity.java 3、utils/FileUtils.java 4、utils/UriUtils.java 5、AndroidManifest.xml ...
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); 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 簡訊的主題 * * */ 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"); //註冊一個簡訊息的內容觀察者,專門觀察簡訊特定Uri引起的數據變化情況 sbserver=new SmsObserver(handler); resolver.registerContentObserver(uri,true,sbserver); } private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: 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.sendEmptyMessage(1); } } //讀取聯繫人電話 public void readContact(View view){ Uri uri=ContactsContract.CommonDataKinds.Phone.CONTENT_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 intent=new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 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>