Android Studio 图片上传


      在做app开发的时候图片上传是最基本的功能了,一般都是调用手机相机拍照,然后上传到服务器上。下面就说一下,如何调用相机拍照并上传到服务器上的。

首先要在AndroidManifest.xml添加网络权限:

  调用相机权限:  

 <uses-permission android:name="android.permission.CAMERA" />

 往服务器上上传图片,需要网络权限:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>`

上传图片我们一般不用Android studio自带的上传方法,会用插件来实现图片上传,这里推荐使用okhttp.

 

 将okhttp插件导入工程后,下面就直接上代码了。

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".GaoWen.CamerIcon">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:layout_margin="10dp"
        android:layout_weight="4">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="请填写备注:"
            android:textSize="20dp"
            android:gravity="center_vertical"/>
        <EditText
            android:id="@+id/text_info"
            android:layout_weight="3"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:inputType="textMultiLine"
            android:layout_gravity="center"
            android:gravity="left|top"
            android:background="@drawable/log"
            android:minLines="6"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:layout_margin="10dp"
        android:layout_weight="1">
        <TextView

            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="照片列表:"
            android:textSize="20dp"
            android:gravity="center_vertical"/>

    </LinearLayout>

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3"
        android:layout_margin="10dp"
        android:background="@drawable/log"
        >
        <LinearLayout
            android:id="@+id/iconlayout"
            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:orientation="horizontal"
          >

        </LinearLayout>
    </HorizontalScrollView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2">
        <ImageView
            android:id="@+id/addimg"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:layout_marginLeft="150dp"
            android:layout_marginRight="150dp"
            android:src="@drawable/xiangji"

            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/submit"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:text="提交"

            android:textColor="@color/white"
            android:background="@drawable/point_logbtn"

            />
    </LinearLayout>

</LinearLayout>

动态开启摄像机权限:

 public void openCamera() {

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        uri = getImageUri();
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, 1);
    }
    
    public Uri getImageUri() {


        File refile=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),"path");
        if (!refile.exists()){refile.mkdirs();}
        imaname=System.currentTimeMillis()+".png";
        file = new File(refile,   imaname);
       

        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        String path = file.getPath();

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            listpath.add(path);
            uri = Uri.fromFile(file);
        } else {
            //兼容android7.0 使用共享文件的形式
            // uri= FileProvider.getUriForFile(MainPage.this, "com.example.appmanager.fileProvider", file);

            ContentValues contentValues = new ContentValues(1);
            contentValues.put(MediaStore.Images.Media.DATA, path);
            uri = this.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        }
        return uri;
    }


    /**
     * 回调
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @SuppressLint("ResourceType")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==1){
            LinearLayout.LayoutParams lytp = new LinearLayout.LayoutParams(300,400);
            ImageView imageView=new ImageView(this);
            lytp.setMargins(10,10,0,0);
            imageView.setLayoutParams(lytp);
            LinearLayout layout= ((LinearLayout) this.findViewById(R.id.iconlayout));
            imageView.setOnClickListener(new View.OnClickListener() {
                                             @Override
                                             public void onClick(View v) {
                                              
                                                 LayoutInflater inflater = LayoutInflater.from(CamerIcon.this);
                                                 View imgEntryView = inflater.inflate(R.layout.largeicon, null); // 加载自定义的布局文件
                                                 final AlertDialog dialog = new AlertDialog.Builder(CamerIcon.this).create();
                                                 ImageView img = imgEntryView.findViewById(R.id.large_image);
                                                 Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
                                                 img.setImageBitmap(bitmap);
                                                 dialog.setView(imgEntryView); // 自定义dialog
                                                 dialog.show();
                                                 // 点击布局文件(也可以理解为点击大图)后关闭dialog,这里的dialog不需要按钮
                                                 imgEntryView.setOnClickListener(new View.OnClickListener() {
                                                     public void onClick(View paramView) {
                                                         dialog.cancel();
                                                     }
                                                 });


                                             }
                                         });
            imageView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {

                    new AlertDialog.Builder(CamerIcon.this)
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .setTitle("提示")
                            .setMessage("你确定要删除吗")
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    layout.removeView(imageView);
                                    if (list.size()>0){
                                        int j=0;

                                        //需求是删除B和D
                                        Iterator<Icon> iterator = list.iterator();
                                        while (iterator.hasNext()) {
                                            Icon value = iterator.next();
                                            if (value.getImageID()==v.getId()) {
                                                iterator.remove();
                                                Log.e("======", value + "已经移除");
                                            }
                                        }



                                    }

                                    //  finish();//Exit Activity
                                }
                            })
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int whichButton) {
                                }
                            }).create().show();

                    return true;
                }
            });
            layout.addView(imageView);
            imageView.setImageURI(uri);
            imageView.setBackgroundResource(R.drawable.log);
          
        }
        if (requestCode==2 && data != null){
            //获取图片路径
            Uri selectedImage = data.getData();
            String[] filePathColumns = {MediaStore.Images.Media.DATA};
            Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePathColumns[0]);
            String imagePath = c.getString(columnIndex);
            Bitmap bm = BitmapFactory.decodeFile(imagePath);
          //  img.setImageBitmap(bm);
            c.close();
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(permissions[0].equals(Manifest.permission.CAMERA)){
            if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
                Toast.makeText(CamerIcon.this,"已授权",Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
    /**
     * 判断是否授权开启摄像机功能
     */
    private  void  isOpenPhoto(){

        if (Build.VERSION.SDK_INT >= 23) {
                     int REQUEST_CODE_CONTACT = 101;
                              String[] permissions = {
              Manifest.permission.WRITE_EXTERNAL_STORAGE};
                                    //验证是否许可权限
                              for (String str : permissions) {
                           if (CamerIcon.this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                                    //申请权限
                           CamerIcon.this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                           return;
                  } }
                        }

        if(Build.VERSION.SDK_INT>=23){
            ActivityCompat.requestPermissions(CamerIcon.this,new String[]{Manifest.permission.CAMERA},0);
            int permission = ContextCompat.checkSelfPermission(CamerIcon.this.getApplicationContext(), Manifest.permission.CAMERA);
            if(permission== PackageManager.PERMISSION_GRANTED){
                //如果有了相机的权限就调用相机

            }else {
                AlertDialog.Builder builder=new AlertDialog.Builder(CamerIcon.this);
                builder.setTitle("提示");
                builder.setMessage("是否开启相机权限");
                builder.setPositiveButton("", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //去请求相机权限
                        ActivityCompat.requestPermissions(CamerIcon.this,new String[]{Manifest.permission.CAMERA},0);
                    }
                });
                builder.setNegativeButton("", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(CamerIcon.this, "您拒绝了开启相机权限", Toast.LENGTH_SHORT).show();
                    }
                });
                builder.show();
            }
        }
    }

将图片上传到服务器的方法:

public void uploading(View view,String url,File file) {

        //创建RequestBody封装参数
        RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file);// MediaType.parse("image/jpeg")//application/octet-stream
        //创建MultipartBody,给RequestBody进行设置
        MultipartBody multipartBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file",file.getName(), fileBody)
                .build();
        //创建Request
        Request request = new Request.Builder()
                .url(url)//"ip:1111/Api/App/ImgUpload?UId=7"
                .post(multipartBody)
                .build();

        //创建okhttp对象
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .build();
        //上传完图片,得到服务器反馈数据
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("ff", "uploadMultiFile() e=" + e);
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("ff", "uploadMultiFile() response=" + response.body().string());
            }
        });
    }

效果:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM