相册选取照片上传 2

动态获取权限

  private void checkPermiss() {
        int i = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (i != PackageManager.PERMISSION_GRANTED) {//没有授权,申请权限
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.CAMERA
            }, 100);
        }
    }

开启相册并选择图片上传(注意权限处理):

 private void openAlbum() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, ALBUM_CODE);
    }
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100 && resultCode == RESULT_OK) {//拍照成功,返回成功
            //直接上传
//          ok上传
            long time = System.currentTimeMillis();
            File mFile = new File(getExternalCacheDir(), time + ".jpg");
            uploadOk(mFile);

        }
        if (requestCode == 200 && resultCode == RESULT_OK) {//相册选择照片后的回传
            Uri uri = data.getData();//得到所选照片的路径的uri
            String scheme = uri.getScheme();//得到当前手机对应相册的scheme
            String imgPath = "";
            if (scheme.equals("file")) {//低版本手机,直接获取图片的路径
                imgPath = uri.getPath();//得到照片的路径
            } else {//高版本需要到内容提供者读取
                imgPath = getPathFromContent(uri);
            }
            if (!"".equals(imgPath)) {//imgPath不为空,则上传
                File _file = new File(imgPath);//实例化图片对象
//              ok上传
                uploadOk(_file);
            }
        }
    }

** //到内容提供者读取照片的路径**

 private String getPathFromContent(Uri uri) {
        if (uri == null)
            return "";
        ContentResolver resolver = getContentResolver();//内容解析者
        //查询 通过照片的uri路径
        Cursor cursor = resolver.query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();//因为只有一张,所以读取第一张即可
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA));//得到图片的路径
            return path;
        }
        return "";
    }

OK上传

    private void uploadOk(File file) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

        RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file);

        MultipartBody body = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("key", "1908A")
                .addFormDataPart("file", file.getName(), requestBody)
                .build();


        Request request = new Request.Builder()
                .url("http://yun918.cn/study/public/file_upload.php")
                .post(body)
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {
                Log.d(TAG, "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                String string = response.body().string();
                final UpLoadBean upLoadBean = new Gson().fromJson(string, UpLoadBean.class);
                final UpLoadBean.DataBean data = upLoadBean.getData();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, upLoadBean.getRes(), Toast.LENGTH_SHORT).show();
                        Log.d(TAG, "run: " + upLoadBean.getRes());
                        Glide.with(MainActivity.this).load(data.getUrl()).into(mImage);

                    }
                });
            }

        });
    }

**版本9.0以及9.0以上需要加以下方案,否则会报
错误:CLEARTEXT communication to www.baidu.com not permitted by network security policy
解决方案:

在application节点添加:android:usesCleartextTraffic="true"

 <application
    ……………………
     android:usesCleartextTraffic="true">
 
    ………………………………
 
  </application>
Android平台上,实现拍照或从相册选取图片上传多张可以通过以下步骤实现。首先,需要在AndroidManifest.xml文件中添加相机和存储权限。接着,在相应的Activity中,我们可以使用Intent来启动系统相机应用,或者打开系统相册应用。 如果是拍照上传,我们可以创建一个Intent对象,指定Action为MediaStore.ACTION_IMAGE_CAPTURE,然后使用startActivityForResult方法启动相机应用。拍摄完成后,系统会将照片保存在指定的URI路径上。 如果是从相册选取图片上传,我们同样可以创建一个Intent对象,指定Action为Intent.ACTION_PICK,Type为“image/*”,然后使用startActivityForResult方法启动相册应用。 接着,在onActivityResult方法中,我们可以根据requestCode和resultCode来判断是从相机还是相册返回的数据。如果是从相机返回的数据,我们可以通过指定的URI路径来获取拍摄的照片;如果是从相册返回的数据,我们可以通过data.getData()方法来获取选取的图片。 最后,我们可以将获取到的照片进行上传操作,可以是将图片转换成Bitmap对象,然后上传至服务器;或者将图片的URI路径传递给服务器进行上传。如果有多张图片需要上传,可以采用循环的方式依次处理每张图片。 总的来说,实现拍照或从相册选取图片上传多张,需要通过Intent调用系统应用获取图片,然后在onActivityResult方法中处理返回的数据,最后进行图片的上传操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值