Android實(shí)現(xiàn)調(diào)用系統(tǒng)圖庫(kù)與相機(jī)設(shè)置頭像并保存在本地及服務(wù)器
廢話不多說(shuō)了,直接給大家貼代碼了,具體代碼如下所述:
/** * 1、實(shí)現(xiàn)原理:用戶打開相冊(cè)或相機(jī)選擇相片后,相片經(jīng)過(guò)壓縮并設(shè)置在控件上,圖片在本地sd卡存一份(如果有的話,沒(méi)有則內(nèi)部存儲(chǔ),所以還 * 需要判斷用戶是否掛載了sd卡),然后在服務(wù)器上存儲(chǔ)一份該圖片,當(dāng)下次再次啟動(dòng)應(yīng)用時(shí),會(huì)默認(rèn)去sd卡加載該圖片,如果本地沒(méi)有,再會(huì)去聯(lián)網(wǎng)請(qǐng)求 * 2、使用了picasso框架以及自定義BitmapUtils工具類 * 3、記得加上相關(guān)權(quán)限 * <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> * */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView iv;//要設(shè)置的頭像 private Button btn_photo;//調(diào)用相冊(cè)按鈕 private Button btn_camera;//調(diào)用相機(jī)按鈕 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv=(ImageView) findViewById(R.id.iv); btn_photo = (Button) findViewById(R.id.btn_photo); btn_camera = (Button) findViewById(R.id.btn_camera); btn_photo.setOnClickListener(this); btn_camera.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_photo://打開系統(tǒng)相冊(cè) Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,100); break; case R.id.btn_camera://打開系統(tǒng)相機(jī) Intent intent2=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent2,200); break; } } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==100&&resultCode==RESULT_OK&&data!=null){//系統(tǒng)相冊(cè) Uri imageData = data.getData(); String path=getPath(imageData); Bitmap bitmap = BitmapFactory.decodeFile(path); Bitmap bitmap1 = BitmapUtils.zoom(bitmap, iv.getWidth(), iv.getHeight()); Bitmap bitmap2 = BitmapUtils.circleBitmap(bitmap1); //加載顯示 iv.setImageBitmap(bitmap2); //bitmap圖片上傳到服務(wù)器...... //bitmap圖片保存到本地 saveImage(bitmap2); }else if(requestCode==200&&resultCode==RESULT_OK&&data!=null){//系統(tǒng)相機(jī) Bitmap bitmap = (Bitmap) data.getExtras().get("data"); BitmapUtils.zoom(bitmap,iv.getWidth(),iv.getHeight()); bitmap=BitmapUtils.circleBitmap(bitmap); //加載顯示 iv.setImageBitmap(bitmap); //bitmap圖片上傳到服務(wù)器...... //bitmap圖片保存到本地 saveImage(bitmap); } } /** * 數(shù)據(jù)的存儲(chǔ)。(5種) * Bimap:內(nèi)存層面的圖片對(duì)象。 * * 存儲(chǔ)--->內(nèi)存: * BitmapFactory.decodeFile(String filePath); * BitmapFactory.decodeStream(InputStream is); * 內(nèi)存--->存儲(chǔ): * bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStream os); */ private void saveImage(Bitmap bitmap) { File filesDir; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判斷sd卡是否掛載 //路徑1:storage/sdcard/Android/data/包名/files filesDir = this.getExternalFilesDir(""); }else{//手機(jī)內(nèi)部存儲(chǔ) //路徑:data/data/包名/files filesDir = this.getFilesDir(); } FileOutputStream fos = null; try { File file = new File(filesDir,"icon.png"); fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100,fos); } catch (FileNotFoundException e) { e.printStackTrace(); }finally{ if(fos != null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } //如果本地有,就不需要再去聯(lián)網(wǎng)去請(qǐng)求 private boolean readImage() { File filesDir; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判斷sd卡是否掛載 //路徑1:storage/sdcard/Android/data/包名/files filesDir = getExternalFilesDir(""); }else{//手機(jī)內(nèi)部存儲(chǔ) //路徑:data/data/包名/files filesDir = getFilesDir(); } File file = new File(filesDir,"icon.png"); if(file.exists()){ //存儲(chǔ)--->內(nèi)存 Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); iv.setImageBitmap(bitmap); return true; } return false; } @RequiresApi(api = Build.VERSION_CODES.KITKAT) private String getPath(Uri uri) { int sdkVersion = Build.VERSION.SDK_INT; //高于4.4.2的版本 if (sdkVersion >= 19) { Log.e("TAG", "uri auth: " + uri.getAuthority()); if (isExternalStorageDocument(uri)) { String docId = DocumentsContract.getDocumentId(uri); String[] split = docId.split(":"); String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(this, contentUri, null, null); } else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(this, contentUri, selection, selectionArgs); } else if (isMedia(uri)) { String[] proj = {MediaStore.Images.Media.DATA}; Cursor actualimagecursor = this.managedQuery(uri, proj, null, null, null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.moveToFirst(); return actualimagecursor.getString(actual_image_column_index); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(this, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * uri路徑查詢字段 * * @param context * @param uri * @param selection * @param selectionArgs * @return */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } private boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } public static boolean isMedia(Uri uri) { return "media".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } /** * 判斷本地是否有該圖片,沒(méi)有則去聯(lián)網(wǎng)請(qǐng)求 * */ @Override protected void onResume() { super.onResume(); if(readImage()){ return; } } } //BitmapUtils工具類public class BitmapUtils { /** * 該方法用于將圖片進(jìn)行圓形處理 * */ public static Bitmap circleBitmap(Bitmap source){ //默認(rèn)只對(duì)寬進(jìn)行處理 int width=source.getWidth(); Bitmap bitmap=Bitmap.createBitmap(width,width,Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(bitmap); Paint paint=new Paint(); //設(shè)置抗鋸齒 paint.setAntiAlias(true); canvas.drawCircle(width/2,width/2,width/2,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(source,0,0,paint); return bitmap; } /** * 該方法用于圖片壓縮處理,注意width、height參數(shù)的類型必須是float * */ public static Bitmap zoom(Bitmap source,float width,float height){ Matrix matrix=new Matrix(); //圖片進(jìn)行壓縮處理 matrix.postScale(width/source.getWidth(),height/source.getHeight()); Bitmap bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, false); return bitmap; }}
以上所述是小編給大家介紹的Android實(shí)現(xiàn)調(diào)用系統(tǒng)圖庫(kù)與相機(jī)設(shè)置頭像并保存在本地及服務(wù)器 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- Android 系統(tǒng)服務(wù)TelecomService啟動(dòng)過(guò)程原理分析
- Android 添加系統(tǒng)服務(wù)的方法詳解
- Android中獲得正在運(yùn)行的程序和系統(tǒng)服務(wù)的方法
- 往Android系統(tǒng)中添加服務(wù)的方法教程
- Android開發(fā)中調(diào)用系統(tǒng)相冊(cè)上傳圖片到服務(wù)器OPPO等部分手機(jī)上出現(xiàn)短暫的顯示桌面問(wèn)題的解決方法
- Ubuntu中為Android系統(tǒng)實(shí)現(xiàn)內(nèi)置Java應(yīng)用程序測(cè)試Application Frameworks層的硬件服務(wù)
- Android編程獲取系統(tǒng)隱藏服務(wù)實(shí)現(xiàn)鎖屏的方法
- Android系統(tǒng)服務(wù)是如何獲取的
相關(guān)文章
Android miniTwitter登錄界面開發(fā)實(shí)例
這篇文章主要為大家詳細(xì)介紹了Android miniTwitter登錄界面開發(fā)實(shí)例,感興趣的小伙伴們可以參考一下2016-04-04Android權(quán)限管理之Permission權(quán)限機(jī)制及使用詳解
本篇文章主要介紹了Android權(quán)限管理之Permission權(quán)限機(jī)制及使用,主要講訴了android的權(quán)限使用問(wèn)題,有需要的可以了解一下。2016-11-11詳解Android首選項(xiàng)框架的使用實(shí)例
首選項(xiàng)這個(gè)名詞對(duì)于熟悉Android的朋友們一定不會(huì)感到陌生,它經(jīng)常用來(lái)設(shè)置軟件的運(yùn)行參數(shù)。本篇文章主要介紹詳解Android首選項(xiàng)框架的使用實(shí)例,有興趣的可以了解一下。2016-11-11Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字
本文主要介紹了Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04Android ProgressBar 模擬進(jìn)度條效果的實(shí)現(xiàn)
這篇文章主要介紹了Android ProgressBar 模擬進(jìn)度條效果的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Android可簽到日歷控件的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android可簽到日歷控件的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android 照片選擇區(qū)域功能實(shí)現(xiàn)示例
這篇文章主要介紹了Android 照片選擇區(qū)域功能實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Android實(shí)現(xiàn)EditText控件禁止輸入內(nèi)容的方法(附測(cè)試demo)
這篇文章主要介紹了Android實(shí)現(xiàn)EditText控件禁止輸入內(nèi)容的方法,涉及Android針對(duì)EditText控件屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-12-12基于Android SDK-在64位Linux中使用需要注意的問(wèn)題
本篇文章是對(duì)Android SDK-在64位Linux中使用需要注意的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05