Android個(gè)人中心的頭像上傳,圖片編碼及截取實(shí)例
首先需要有網(wǎng)絡(luò)權(quán)限,然后我們這里匹配的網(wǎng)絡(luò)請(qǐng)求是之前封裝好的Okhttp。
非常的簡(jiǎn)單方便,直接復(fù)制進(jìn)去,依賴(lài)一下包,然后調(diào)用方法即可。
這里是把圖片轉(zhuǎn)換成Base64.decode(imageString, Base64.DEFAULT);
轉(zhuǎn)成Base64編碼上傳。具體內(nèi)容也不少,需要完全整明白,還是要花點(diǎn)時(shí)間慢慢看的。
先看看簡(jiǎn)單的效果圖:
那么萬(wàn)事具備,只欠東風(fēng)了。直接上代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView iv_img; private Button bt_camera; private Button bt_xiangce; private static final int PHOTO_REQUEST_CAREMA = 1;// 拍照 private static final int PHOTO_REQUEST_GALLERY = 2;// 從相冊(cè)中選擇 private static final int PHOTO_REQUEST_CUT = 3;// 結(jié)果 /* 頭像名稱(chēng) */ private static final String PHOTO_FILE_NAME = "temp_photo.jpg"; private File tempFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //加載控件 initView(); } private void initView() { iv_img = (ImageView) findViewById(R.id.iv_img); bt_camera = (Button) findViewById(R.id.bt_camera); bt_xiangce = (Button) findViewById(R.id.bt_xiangce); //從SharedPreferences獲取圖片 getBitmapFromSharedPreferences(); //監(jiān)聽(tīng)兩個(gè)按鈕,相冊(cè)按鈕和相機(jī)按鈕 bt_camera.setOnClickListener(this); bt_xiangce.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_camera: // 激活相機(jī) Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); // 判斷存儲(chǔ)卡是否可以用,可用進(jìn)行存儲(chǔ) if (hasSdcard()) { tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME); // 從文件中創(chuàng)建uri Uri uri = Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } // 開(kāi)啟一個(gè)帶有返回值的Activity,請(qǐng)求碼為PHOTO_REQUEST_CAREMA startActivityForResult(intent, PHOTO_REQUEST_CAREMA); break; case R.id.bt_xiangce: // 激活系統(tǒng)圖庫(kù),選擇一張圖片 Intent intent1 = new Intent(Intent.ACTION_PICK); intent1.setType("image/*"); // 開(kāi)啟一個(gè)帶有返回值的Activity,請(qǐng)求碼為PHOTO_REQUEST_GALLERY startActivityForResult(intent1, PHOTO_REQUEST_GALLERY); break; } } /* * 判斷sdcard是否被掛載 */ private boolean hasSdcard() { //判斷SD卡手否是安裝好的 media_mounted if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } /* * 剪切圖片 */ private void crop(Uri uri) { // 裁剪圖片意圖 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // 裁剪框的比例,1:1 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // 裁剪后輸出圖片的尺寸大小 intent.putExtra("outputX", 250); intent.putExtra("outputY", 250); intent.putExtra("outputFormat", "JPEG");// 圖片格式 intent.putExtra("noFaceDetection", true);// 取消人臉識(shí)別 intent.putExtra("return-data", true); // 開(kāi)啟一個(gè)帶有返回值的Activity,請(qǐng)求碼為PHOTO_REQUEST_CUT startActivityForResult(intent, PHOTO_REQUEST_CUT); } /** * * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PHOTO_REQUEST_GALLERY) { // 從相冊(cè)返回的數(shù)據(jù) if (data != null) { // 得到圖片的全路徑 Uri uri = data.getData(); crop(uri); } } else if (requestCode == PHOTO_REQUEST_CAREMA) { // 從相機(jī)返回的數(shù)據(jù) if (hasSdcard()) { crop(Uri.fromFile(tempFile)); } else { Toast.makeText(MainActivity.this, "未找到存儲(chǔ)卡,無(wú)法存儲(chǔ)照片!", Toast.LENGTH_SHORT).show(); } } else if (requestCode == PHOTO_REQUEST_CUT) { // 從剪切圖片返回的數(shù)據(jù) if (data != null) { Bitmap bitmap = data.getParcelableExtra("data"); /** * 獲得圖片 */ iv_img.setImageBitmap(bitmap); //保存到SharedPreferences saveBitmapToSharedPreferences(bitmap); } try { // 將臨時(shí)文件刪除 tempFile.delete(); } catch (Exception e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data); } //保存圖片到SharedPreferences private void saveBitmapToSharedPreferences(Bitmap bitmap) { // Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //第一步:將Bitmap壓縮至字節(jié)數(shù)組輸出流ByteArrayOutputStream ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream); //第二步:利用Base64將字節(jié)數(shù)組輸出流中的數(shù)據(jù)轉(zhuǎn)換成字符串String byte[] byteArray = byteArrayOutputStream.toByteArray(); String imageString = new String(Base64.encodeToString(byteArray, Base64.DEFAULT)); //第三步:將String保持至SharedPreferences SharedPreferences sharedPreferences = getSharedPreferences("testSP", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("image", imageString); editor.commit(); //上傳頭像 setImgByStr(imageString,""); } /** * 上傳頭像 * @param imgStr * @param imgName */ public void setImgByStr(String imgStr, String imgName) { //這里是頭像接口,通過(guò)Post請(qǐng)求,拼接接口地址和ID,上傳數(shù)據(jù)。 String url = "http://這里寫(xiě)的是接口地址(具體接收格式要看后臺(tái)怎么給)"; Map<String, String> params = new HashMap<String, String>(); params.put("id", "11111111");// 11111111 params.put("data", imgStr); OkHttp.postAsync(url, params, new OkHttp.DataCallBack() { @Override public void requestFailure(Request request, IOException e) { Log.i("上傳失敗", "失敗" + request.toString() + e.toString()); } @Override public void requestSuccess(String result) throws Exception { Toast.makeText(MainActivity.this,"上傳成功",Toast.LENGTH_SHORT).show(); Log.i("上傳成功", result); } }); } //從SharedPreferences獲取圖片 private void getBitmapFromSharedPreferences(){ SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE); //第一步:取出字符串形式的Bitmap String imageString=sharedPreferences.getString("image", ""); //第二步:利用Base64將字符串轉(zhuǎn)換為ByteArrayInputStream byte[] byteArray= Base64.decode(imageString, Base64.DEFAULT); if(byteArray.length==0){ iv_img.setImageResource(R.mipmap.ic_launcher); }else{ ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray); //第三步:利用ByteArrayInputStream生成Bitmap Bitmap bitmap= BitmapFactory.decodeStream(byteArrayInputStream); iv_img.setImageBitmap(bitmap); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android ScrollView實(shí)現(xiàn)橫向和豎向拖動(dòng)回彈效果
這篇文章主要為大家詳細(xì)介紹了Android ScrollView實(shí)現(xiàn)橫向和豎向拖動(dòng)回彈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Android編程實(shí)現(xiàn)扭曲圖像的繪制功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)扭曲圖像的繪制功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android圖形扭曲的具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09Android 退出多Activity的application的方式方法
在開(kāi)發(fā)過(guò)程中,我們常常需要一個(gè)退出功能,來(lái)退出該應(yīng)用的所有Activity,本篇文章主要介紹了Android 退出多Activity的application的方式,有興趣的可以了解一下。2017-02-02Android實(shí)現(xiàn)微信自動(dòng)向附近的人打招呼(AccessibilityService)
這篇文章主要為大家詳細(xì)介紹了實(shí)現(xiàn)微信自動(dòng)向附近的人打招呼,實(shí)現(xiàn)收到指定賬戶(hù)推送文章時(shí)自動(dòng)進(jìn)入微信打開(kāi)鏈接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android項(xiàng)目中使用HTTPS配置的步驟詳解
這篇文章主要給大家介紹了關(guān)于Android項(xiàng)目中使用HTTPS配置步驟的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06Android AsyncTask的缺陷和問(wèn)題總結(jié)
這篇文章主要介紹了Android AsyncTask的缺陷和問(wèn)題總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果
本文將帶大家學(xué)習(xí)一下如何利用toast中的motion_toast組件實(shí)現(xiàn)一個(gè)流動(dòng)的漸變色邊框效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-02-02