• Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切


    效果:



    注意:
    1:网络权限

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    2:我封装了一个OKHttp,需要在build.gradle 中加入

    compile 'com.squareup.okhttp3:logging-interceptor:3.4.2' 在同步一在
    3:用
    SharedPreferences 保存和获取图片了,将图片和字符串进行了转换
    4: 可以调用相机和相册获取图片,并进行剪切


    //-----------------我的布局文件-----------------------------

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="tckpicture.bwie.com.tackpicture2.MainActivity">

    <ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:scaleType="fitXY"
    android:src="@mipmap/ic_launcher"
    android:id="@+id/iv_img"/>
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="相机"
    android:id="@+id/bt_camera"/>
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="相册"
    android:id="@+id/bt_xiangce"/>
    </LinearLayout>

    //-------------我的
    MainActivity -------------------------

    package tckpicture.bwie.com.tackpicture2;

    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Base64;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;

    import okhttp3.Request;

    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);// 取消人脸识别
    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,"");

    }


    /**
    * 上传头像 此处使用用的OKHttp post请求上传的图片
    * @param imgStr
    * @param imgName
    */
    public void setImgByStr(String imgStr, String imgName) {

    String url = "http://appserver。。。。。。。";
    Map<String, String> params = new HashMap<String, String>();
    params.put("id", "参数值");//
    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 {

    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);
    }

    }

    }



    //下面是我封装的一个 OKHttp
    注意:需要在build.gradle 中添加下面这句,然后在同步一下

    compile 'com.squareup.okhttp3:logging-interceptor:3.4.2'


    //----------下面是封装的OKHttp类------------------

    package tckpicture.bwie.com.tackpicture2;

    import android.os.Handler;
    import android.os.Looper;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;

    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.FormBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.logging.HttpLoggingInterceptor;


    /**
    * Created by fan on 2016/11/9.
    */

    public class OkHttp {


    /**
    * 静态实例
    */
    private static OkHttp sOkHttpManager;


    /**
    * okhttpclient实例
    */
    private OkHttpClient mClient;


    /**
    * 因为我们请求数据一般都是子线程中请求,在这里我们使用了handler
    */
    private Handler mHandler;


    /**
    * 构造方法
    */
    private OkHttp() {

    // // 可以通过实现 Logger 接口更改日志保存位置
    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    // mClient = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();
    mClient = new OkHttpClient();

    /**
    * 在这里直接设置连接超时.读取超时,写入超时
    */

    OkHttpClient.Builder builder = mClient.newBuilder();

    builder.connectTimeout(10, TimeUnit.SECONDS);
    builder.readTimeout(10, TimeUnit.SECONDS);
    builder.writeTimeout(10, TimeUnit.SECONDS);
    builder.addInterceptor(loggingInterceptor);
    mClient = builder.build();

    /**
    * 如果是用的3.0之前的版本 使用以下直接设置连接超时.读取超时,写入超时
    */

    //client.setConnectTimeout(10, TimeUnit.SECONDS);
    //client.setWriteTimeout(10, TimeUnit.SECONDS);
    //client.setReadTimeout(30, TimeUnit.SECONDS);


    /**
    * 初始化handler
    */
    mHandler = new Handler(Looper.getMainLooper());

    }



    /**
    * 单例模式 获取OkHttp实例
    *
    * @return
    */
    public static OkHttp getInstance() {


    if (sOkHttpManager == null) {
    sOkHttpManager = new OkHttp();
    }
    return sOkHttpManager;
    }

    //-------------------------同步的方式请求数据--------------------------

    /**
    * 对外提供的get方法,同步的方式
    *
    * @param url 传入的地址
    * @return
    */
    public static Response getSync(String url) {


    //通过获取到的实例来调用内部方法
    return sOkHttpManager.inner_getSync(url);

    }

    /**
    * GET方式请求的内部逻辑处理方式,同步的方式
    *
    * @param url
    * @return
    */
    private Response inner_getSync(String url) {

    Request request = new Request.Builder().url(url).build();
    Response response = null;
    try {
    //同步请求返回的是response对象
    response = mClient.newCall(request).execute();

    } catch (IOException e) {
    e.printStackTrace();
    }
    return response;
    }

    /**
    * 对外提供的同步获取String的方法
    *
    * @param url
    * @return
    */
    public static String getSyncString(String url) {

    return sOkHttpManager.inner_getSyncString(url);
    }


    /**
    * 同步方法
    */
    private String inner_getSyncString(String url) {

    String result = null;
    try {
    /**
    * 把取得到的结果转为字符串,这里最好用string()
    */
    result = inner_getSync(url).body().string();

    } catch (IOException e) {
    e.printStackTrace();
    }
    return result;
    }

    //-------------------------异步的方式请求数据--------------------------
    public static void getAsync(String url, DataCallBack callBack) {

    getInstance().inner_getAsync(url, callBack);
    }

    /**
    * 内部逻辑请求的方法
    *
    * @param url
    * @param callBack
    * @return
    */
    private void inner_getAsync(String url, final DataCallBack callBack) {

    final Request request = new Request.Builder().url(url).build();

    mClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    deliverDataFailure(request, e, callBack);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

    String result = null;
    try {
    result = response.body().string();
    } catch (IOException e) {
    deliverDataFailure(request, e, callBack);
    }
    deliverDataSuccess(result, callBack);
    }
    });
    }


    /**
    * 分发失败的时候调用
    *
    * @param request
    * @param e
    * @param callBack
    */
    private void deliverDataFailure(final Request request, final IOException e, final DataCallBack callBack) {

    /**
    * 在这里使用异步处理
    */
    mHandler.post(new Runnable() {

    @Override
    public void run() {

    if (callBack != null) {
    callBack.requestFailure(request, e);
    }
    }
    });
    }

    /**
    * 分发成功的时候调用
    *
    * @param result
    * @param callBack
    */
    private void deliverDataSuccess(final String result, final DataCallBack callBack) {

    /**
    * 在这里使用异步线程处理
    */
    mHandler.post(new Runnable() {

    @Override
    public void run() {

    if (callBack != null) {
    try {
    callBack.requestSuccess(result);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    });
    }

    /**
    * 数据回调接口
    */
    public interface DataCallBack {

    void requestFailure(Request request, IOException e);

    void requestSuccess(String result) throws Exception;
    }

    //-------------------------提交表单--------------------------

    public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) {

    getInstance().inner_postAsync(url, params, callBack);
    }

    private void inner_postAsync(String url, Map<String, String> params, final DataCallBack callBack) {

    RequestBody requestBody = null;
    if (params == null) {
    params = new HashMap<>();
    }

    /**
    * 如果是3.0之前版本的,构建表单数据是下面的一句
    */
    //FormEncodingBuilder builder = new FormEncodingBuilder();

    /**
    * 3.0之后版本
    */
    FormBody.Builder builder = new FormBody.Builder();


    /**
    * 在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找
    */
    for (Map.Entry<String, String> map : params.entrySet()) {

    String key = map.getKey().toString();
    String value = null;
    /**
    * 判断值是否是空的
    */
    if (map.getValue() == null) {

    value = "";
    } else {
    value = map.getValue();
    }
    /**
    * 把key和value添加到formbody中
    */
    builder.add(key, value);

    }
    requestBody = builder.build();
    //结果返回
    // 请求对象
    final Request request = new Request.Builder().url(url).post(requestBody).build();

    mClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    deliverDataFailure(request, e, callBack);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

    String result = response.body().string();
    deliverDataSuccess(result, callBack);
    }


    });
    }


    //-------------------------文件下载--------------------------
    public static void downloadAsync(String url, String desDir, DataCallBack callBack) {

    getInstance().inner_downloadAsync(url, desDir, callBack);
    }

    /**
    * 下载文件的内部逻辑处理类
    *
    * @param url 下载地址
    * @param desDir 目标地址
    * @param callBack
    */
    private void inner_downloadAsync(final String url, final String desDir, final DataCallBack callBack) {

    final Request request = new Request.Builder().url(url).build();
    mClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    deliverDataFailure(request, e, callBack);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {


    /**
    * 在这里进行文件的下载处理
    */
    InputStream inputStream = null;

    FileOutputStream fileOutputStream = null;
    try {
    //文件名和目标地址
    File file = new File(desDir, getFileName(url));

    //把请求回来的response对象装换为字节流
    inputStream = response.body().byteStream();

    fileOutputStream = new FileOutputStream(file);
    int len = 0;
    byte[] bytes = new byte[2048];
    //循环读取数据
    while ((len = inputStream.read(bytes)) != -1) {

    fileOutputStream.write(bytes, 0, len);
    }
    //关闭文件输出流
    fileOutputStream.flush();

    //调用分发数据成功的方法
    deliverDataSuccess(file.getAbsolutePath(), callBack);

    } catch (IOException e) {
    //如果失败,调用此方法
    deliverDataFailure(request, e, callBack);

    e.printStackTrace();
    } finally {
    if (inputStream != null) {
    inputStream.close();
    }
    if (fileOutputStream != null) {
    fileOutputStream.close();
    }

    }
    }

    });
    }

    /**
    * 根据文件url获取文件的路径名字
    *
    * @param url
    * @return
    */
    private String getFileName(String url) {

    int separatorIndex = url.lastIndexOf("/");
    String path = (separatorIndex < 0) ? url : url.substring(separatorIndex + 1, url.length());
    return path;
    }



    }


    //---------------完了-----------------
    package tckpicture.bwie.com.tackpicture2;

    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Base64;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;

    import okhttp3.Request;

    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);// 取消人脸识别
    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) {
    String url = "http://appserver.1035.mobi/MobiSoft/User_upLogo";
    Map<String, String> params = new HashMap<String, String>();
    params.put("id", "11460047");// 11459832
    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 {
    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);
    }

    }

    }
  • 相关阅读:
    数据结构与算法之PHP实现二叉树的遍历
    数据结构与算法之二叉树的基本概念和类型
    JS实现下拉单的二级联动
    数据结构与算法之PHP实现队列、栈
    数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
    数据结构与算法之数组、链表、队列、栈
    大型网站架构总结
    MySQL分库分表
    C基础 那些年用过的奇巧淫技
    C高级 服务器内核分析和构建 (一)
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/6160286.html
Copyright © 2020-2023  润新知