android 图片上传

本文详细介绍了在Android应用中实现图片上传的功能,包括XML布局的设计和Activity代码的编写,主要涉及Android与Webview的交互以及Java编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xml布局

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="4dp">
        <LinearLayout
            android:id="@+id/ll_contain"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
        <ImageButton
            android:id="@+id/ib_add_photo"
            android:layout_width="78dp"
            android:layout_height="78dp"
            android:layout_marginTop="8dp"
            android:src="@drawable/icon_coffee_photograph"
            android:background="#f2f2f2"
            />
    </LinearLayout>


</HorizontalScrollView>

activity代码

package com.example.thinkpad.shop.activity.shop;

import android.Manifest;
import android.app.Activity;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.RecyclerView;

import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;


import com.donkingliang.imageselector.utils.ImageSelector;
import com.example.thinkpad.shop.activity.BaseActivity;
import com.example.thinkpad.shop.adapter.ImageAdapter;
import com.example.thinkpad.shop.ui.DeleteImageView;
import com.example.thinkpad.shop.ui.SelfDialog;

import jp.wasabeef.richeditor.RichEditor;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import com.example.thinkpad.shop.R;
import com.example.thinkpad.shop.utils.Constants;

/**
 * 发布物品
 */
public class GoodsReleaseActivity extends BaseActivity implements View.OnClickListener {


    private ArrayList<String> arr = new ArrayList<String>();
    private ArrayList<String> arrPath = new ArrayList<String>();


    private Bitmap mBitmap;
    private File tempFile;
    private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
    private ImageView iv_iamge;

    private static final int CROP_SMALL_PICTURE = 0;

    /***
     * 使用照相机拍照获取图片
     */
    public static final int SELECT_PIC_BY_TACK_PHOTO = 1;


    /***
     * 使用相册中的图片
     */
    public static final int SELECT_PIC_BY_PICK_PHOTO = 2;

    /***
     * 从Intent获取图片路径的KEY
     */
    public static final String KEY_PHOTO_PATH = "photo_path";
    /**
     * 获取到的图片路径
     */
    private String picPath;

    private Intent lastIntent;

    private Uri photoUri;
    private Uri tmpUri;


    private static final String TAG = "SelectPicActivity";


    /**
     * 选择文件
     */
    public static final int TO_SELECT_PHOTO = 3;


    private ImageView imageView;


    private ListView lv_list1;
    private ListView lv_list2;
    private ListView lv_list3;

    private TextView lv_listName1;
    private TextView lv_listName2;
    private TextView lv_listName3;

    private TextView catId1;
    private TextView catId2;
    private TextView catId3;


    private TextView goodsCatId1;
    private TextView goodsCatId2;
    private TextView goodsCatId3;

    private Button btn_photo;
    private Button btn_picture;
    private Button btn_cancel;

    private ImageView mImageSelect;


    private RichEditor mEditor;
    private TextView mPreview;

    //调用系统相册-选择图片
    private static final int IMAGE = 3;

    String[] mPermissionList = new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE};

    private ImageView mIvReturn;
    private SelfDialog selfDialog;
    private EditText mEditText;

    private Dialog mSelectDialog;
    private Dialog mUploadDialog;

    private Context context;
    public List<Map<String, Object>> list = new ArrayList<>();
    public List<Map<String, Object>> list2 = new ArrayList<>();
    public List<Map<String, Object>> list3 = new ArrayList<>();


    private String path = "";

    private String dataId;
    private ArrayList<String> defaultDataArray;

    private String imgString = "";
    private int maxImgCount = 5; //允许选择图片最大数


    // private CommitsAdapter adapter;

    private ImageAdapter mAdapter;
    private RecyclerView rvImage;

    private TextView tv_save;


    private String userName;
    private String password;
    private String mobile;

    private String shopId;


    private ImageButton mIbAddPhoto;
    private LinearLayout mLlContain;
    private int size = 0;

    private Map<String, String> map;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_release_goods);

        iv_iamge = (ImageView) findViewById(R.id.iv_image);


     /*   rvImage = findViewById(R.id.rv_image);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        rvImage.setLayoutManager(layoutManager);
        mAdapter = new ImageAdapter(this);
        rvImage.setAdapter(mAdapter);*/


        mIvReturn = findViewById(R.id.iv_return);
        mIvReturn.setOnClickListener(this);

        mEditText = findViewById(R.id.et_category);
        mEditText.setFocusable(false);//让EditText失去焦点,然后获取点击事件
        mEditText.setOnClickListener(this);

     /*   mImageSelect = findViewById(R.id.image_select);
        mImageSelect.setOnClickListener(this);*/

        initView();
        initEditor();

        //1.查询登录会员信息
        SharedPreferences sp = this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
        userName = sp.getString("l_loginSecret", ""); //安全码
        password = sp.getString("l_password", "");
        mobile = sp.getString("l_userPhone", "");
        //2.根据安全码查询商家账号是否存在    l_loginSecret- userName
        //3.查询店铺信息

        Log.e("userName", userName);
        isShopExist();


    }

    private void isShopExist() {
        String url = Constants.BASEURL + "/app/shop/isExist";
        OkHttpClient okhttp = new OkHttpClient();
        //创建请求体
        FormBody formBody = new FormBody.Builder()
                .add("userName", userName)
                .build();
        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();
        Call call = okhttp.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // Log.i("mydate" , "失败");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //此方法运行在子线程中,不能在此方法中进行UI操作。
                String responseData = response.body().string();
                Log.e("店铺信息", responseData);
                parsJson(responseData);
            }

        });
    }

    private void parsJson(String jsonData) {
        try {
            JSONObject jsonObject = new JSONObject(jsonData);
            JSONObject data = jsonObject.optJSONObject("data");
            boolean isSuccess = jsonObject.optBoolean("success");
            String msg = jsonObject.optString("msg");

            if (isSuccess == true) {
                shopId = data.optString("shopId");
                SharedPreferences sp = getSharedPreferences("shopInfo", MODE_PRIVATE);
                //获取一个编辑器,记住用户名、密码、
                SharedPreferences.Editor editor = sp.edit();
                //用编辑器将l_userName和l_userPhone放入userInfo.xml中
                editor.putString("shopId", data.optString("shopId"));
                editor.commit();
                //  Looper.prepare();
                //   Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
                //   Looper.loop();
            } else {
                Looper.prepare();
                Toast.makeText(this, "网络异常", Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    private void initView() {
        goodsCatId1 = findViewById(R.id.goodsCatId1);
        goodsCatId2 = findViewById(R.id.goodsCatId2);
        goodsCatId3 = findViewById(R.id.goodsCatId3);

        tv_save = findViewById(R.id.tv_save);

        tv_save.setOnClickListener(this);


        mIbAddPhoto = findViewById(R.id.ib_add_photo);
        mLlContain = findViewById(R.id.ll_contain);

        mIbAddPhoto.setOnClickListener(this);

        mIbAddPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (size >= 5) {
                    Toast.makeText(GoodsReleaseActivity.this, "最多只能上传五张图片", Toast.LENGTH_SHORT).show();
                    return;
                }

                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 0);
                size++;
            }
        });
    }

    private void initEditor() {

        /**
         * 第一种
         */


//        mEditor.disableEdit();


        /**
         *
         */
        /**/
        mEditor = (RichEditor) findViewById(R.id.editor);
        //初始化编辑高度
        mEditor.setEditorHeight(200);
        //初始化字体大小
        mEditor.setEditorFontSize(14);
        //初始化字体颜色
        mEditor.setEditorFontColor(Color.BLACK);
        //mEditor.setEditorBackgroundColor(Color.BLUE);
        //初始化内边距
        mEditor.setPadding(10, 10, 10, 10);
        //设置编辑框背景,可以是网络图片
        //mEditor.setBackground("https://raw.githubusercontent.com/wasabeef/art/master/chip.jpg");
        mEditor.setBackgroundColor(Color.WHITE);
        //mEditor.setBackgroundResource(R.drawable.back);
        //设置默认显示语句
        mEditor.setPlaceholder("请输入描述");
        //设置编辑器是否可用
        mEditor.setInputEnabled(true);


        mPreview = (TextView) findViewById(R.id.preview);
        mEditor.setOnTextChangeListener(new RichEditor.OnTextChangeListener() {
            @Override
            public void onTextChange(String text) {
                mPreview.setText(text);
            }
        });

        /**
         * 撤销当前标签状态下所有内容
         */
        findViewById(R.id.action_undo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.undo();
            }
        });
        /**
         * 恢复撤销的内容
         */
        findViewById(R.id.action_redo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.redo();
            }
        });
        /**
         * 加粗
         */
        findViewById(R.id.action_bold).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                mEditor.setBold();
            }
        });
        /**
         * 斜体
         */
        findViewById(R.id.action_italic).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                mEditor.setItalic();
            }
        });
        /**
         * 下角表
         */
        findViewById(R.id.action_subscript).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                if (mEditor.getHtml() == null) {
                    return;
                }
                mEditor.setSubscript();
            }
        });
        /**
         * 上角标
         */
        findViewById(R.id.action_superscript).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                if (mEditor.getHtml() == null) {
                    return;
                }
                mEditor.setSuperscript();
            }
        });

        /**
         * 删除线
         */
        findViewById(R.id.action_strikethrough).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                mEditor.setStrikeThrough();
            }
        });
        /**
         *下划线
         */
        findViewById(R.id.action_underline).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.focusEditor();
                mEditor.setUnderline();
            }
        });
        /**
         * 设置标题(1到6)
         */
        findViewById(R.id.action_heading1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.setHeading(1);
            }
        });

        findViewById(R.id.action_heading2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.setHeading(2);
            }
        });

        findViewById(R.id.action_heading3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.setHeading(3);
            }
        });

        findViewById(R.id.action_heading4).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.setHeading(4);
            }
        });

        findViewById(R.id.action_heading5).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mEditor.setHeading(5);
            }
        });

        findViewById(R.id.action_heading6).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值