Android個人中心的頭像上傳,圖片編碼及截取

來源:互聯網
上載者:User

標籤:img   listen   網路請求   地址   格式   接收   commit   comm   csdn   

首先需要有網路許可權,然後我們這裡匹配的網路請求是之前封裝好的Okhttp,Okhttp的
非常的簡單方便,直接複製進去,依賴一下包,然後調用方法即可。
這裡是把圖片轉換成Base64.decode(imageString, Base64.DEFAULT);
轉成Base64編碼上傳。具體內容也不少,需要完全整明白,還是要花點時間慢慢看的。

先看看簡單的:



那麼萬事具備,只欠東風了。直接上代碼:

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;// 從相簿中選擇    private static final int PHOTO_REQUEST_CUT = 3;// 結果    /* 頭像名稱 */    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();        //監聽兩個按鈕,相簿按鈕和相機按鈕        bt_camera.setOnClickListener(this);        bt_xiangce.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.bt_camera:                // 啟用相機                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");                // 判斷儲存卡是否可以用,可用進行儲存                if (hasSdcard()) {                    tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME);                    // 從檔案中建立uri                    Uri uri = Uri.fromFile(tempFile);                    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);                }                // 開啟一個帶有傳回值的Activity,請求碼為PHOTO_REQUEST_CAREMA                startActivityForResult(intent, PHOTO_REQUEST_CAREMA);                break;            case R.id.bt_xiangce:                // 啟用系統圖庫,選擇一張圖片                Intent intent1 = new Intent(Intent.ACTION_PICK);                intent1.setType("image/*");                // 開啟一個帶有傳回值的Activity,請求碼為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);// 取消Face Service        intent.putExtra("return-data", true);        // 開啟一個帶有傳回值的Activity,請求碼為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) {            // 從相簿返回的資料            if (data != null) {                // 得到圖片的全路徑                Uri uri = data.getData();                crop(uri);            }        } else if (requestCode == PHOTO_REQUEST_CAREMA) {            // 從相機返回的資料            if (hasSdcard()) {                crop(Uri.fromFile(tempFile));            } else {                Toast.makeText(MainActivity.this, "未找到儲存卡,無法儲存照片!", Toast.LENGTH_SHORT).show();            }        } else if (requestCode == PHOTO_REQUEST_CUT) {            // 從剪下圖片返回的資料            if (data != null) {                Bitmap bitmap = data.getParcelableExtra("data");                /**                 * 獲得圖片                 */                iv_img.setImageBitmap(bitmap);                //儲存到SharedPreferences                saveBitmapToSharedPreferences(bitmap);            }            try {                // 將臨時檔案刪除                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壓縮至位元組數組輸出資料流ByteArrayOutputStream        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();        bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);        //第二步:利用Base64將位元組數組輸出資料流中的資料轉換成字串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) {    //這裡是頭像介面,通過Post請求,拼接介面地址和ID,上傳資料。        String url = "http://這裡寫的是介面地址(具體接收格式要看後台怎麼給)";        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將字串轉換為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);        }    }}

Android個人中心的頭像上傳,圖片編碼及截取

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.