`
uule
  • 浏览: 6309030 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

选择照片和拍照

 
阅读更多

Android拍照或从本地选择图片上传

Android 上传图片到JavaWeb服务器

Android 拍照、选择图片并裁剪

android选择图片或拍照图片上传到服务器(包括上传参数)

 

open failed: EACCES (Permission denied)"权限已加,写入sd卡仍报错的解决办法

Android 6.0 运行时权限处理

 

通过URI获取的文件路径为null的解决方法

 

权限:

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

 

界面:


 

 

代码:

load_weight_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/upload_pic"
        android:layout_width="match_parent"
        android:layout_height="290dp"
        android:layout_gravity="center_horizontal"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/receive_weight"
        android:layout_centerVertical="true"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:adjustViewBounds="true"/>



    <Button
        android:id="@+id/select_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="30.0dip"
        android:layout_marginRight="30.0dip"
        android:layout_gravity="center"
        android:layout_centerInParent="true"
        android:scaleType="fitXY"
        android:background="@mipmap/select_pic_btn" />

    <Button
        android:id="@+id/upload_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="30.0dip"
        android:layout_marginRight="30.0dip"
        android:layout_gravity="center"
        android:layout_centerInParent="true"
        android:scaleType="fitXY"
        android:background="@mipmap/upload_btn" />
</LinearLayout>

 

upload_pic.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <LinearLayout
        android:layout_margin="10dp"
        android:paddingBottom="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_pop_album"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:text="本地相册"
            android:background="#ffff"
            android:textSize="18sp" />

        <Button
            android:id="@+id/btn_pop_camera"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:text="相机拍摄"
            android:background="#ffff"
            android:textSize="18sp" />

        <Button
            android:id="@+id/btn_pop_cancel"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_marginTop="10dp"
            android:background="#ffff"
            android:text="取消"
            android:textSize="18sp" />
    </LinearLayout>


</RelativeLayout>

 

 

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;

import zpwmall.com.tms.R;
import zpwmall.com.tms.adapter.UploadAsyncTask;
import zpwmall.com.tms.constant.Contants;
import zpwmall.com.tms.utils.MyApplication;

public class WeightActivity extends BaseActivity {

    private ImageView upload_pic;

    private Button select_btn,upload_btn;

    private File photoFile = null;

    private Uri tempUri = null;

    private EditText send_weight,receive_weight;

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

        //Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();

        upload_pic = (ImageView)findViewById(R.id.upload_pic);
        select_btn = (Button)findViewById(R.id.select_btn);
        upload_btn = (Button)findViewById(R.id.upload_btn);

        send_weight = (EditText)findViewById(R.id.send_weight);
        receive_weight = (EditText)findViewById(R.id.receive_weight);

        upload_pic.setVisibility(View.GONE);
        select_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopWindow();
            }
        });

        upload_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String send = send_weight.getText().toString();
                String receive = receive_weight.getText().toString();

                if(TextUtils.isEmpty(send)){
                    Toast.makeText(MyApplication.getContext(), R.string.pls_input_send_weight, Toast.LENGTH_SHORT).show();
                    return;
                }

                if(TextUtils.isEmpty(receive)){
                    Toast.makeText(MyApplication.getContext(), R.string.pls_input_receive_weight, Toast.LENGTH_SHORT).show();
                    return;
                }

                if(upload_pic.getDrawable() == null || upload_pic.getDrawable().getCurrent() == null ||
                        upload_pic.getDrawable().getCurrent().getConstantState() == null){
                    Toast.makeText(MyApplication.getContext(), R.string.pls_select_or_take_photo, Toast.LENGTH_SHORT).show();
                    return;
                }

                //String filePath = tempUri.getEncodedPath();
                String filePath = getPathByUri4kitkat(MyApplication.getContext(),tempUri);
                final String imagePath = Uri.decode(filePath);
                new UploadAsyncTask(WeightActivity.this,imagePath).execute();

            }
        });
    }



    private void showPopWindow(){
        View popView = View.inflate(this,R.layout.upload_pic,null);
        Button bt_album = (Button) popView.findViewById(R.id.btn_pop_album);
        Button bt_camera = (Button) popView.findViewById(R.id.btn_pop_camera);
        Button bt_cancle = (Button) popView.findViewById(R.id.btn_pop_cancel);
        //获取屏幕宽高
        int weight = getResources().getDisplayMetrics().widthPixels;
        int height = getResources().getDisplayMetrics().heightPixels*1/3;

        final PopupWindow popupWindow = new PopupWindow(popView,weight,height);
        //popupWindow.setAnimationStyle(R.style.anim_popup_dir);
        popupWindow.setFocusable(true);
        //点击外部popueWindow消失
        popupWindow.setOutsideTouchable(true);

        bt_album.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(i, Contants.RESULT_LOAD_IMAGE);
                popupWindow.dismiss();

            }
        });
        bt_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takeCamera();
                popupWindow.dismiss();

            }
        });
        bt_cancle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();

            }
        });
        //popupWindow消失屏幕变为不透明
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                WindowManager.LayoutParams lp = getWindow().getAttributes();
                lp.alpha = 1.0f;
                getWindow().setAttributes(lp);
            }
        });
        //popupWindow出现屏幕变为半透明
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.alpha = 0.5f;
        getWindow().setAttributes(lp);
        popupWindow.showAtLocation(popView, Gravity.BOTTOM,0,50);

    }


    private void takeCamera() {

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go

            String mTempPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "photo.jpeg";
            photoFile = new File(mTempPhotoPath);
            //photoFile = createImageFile();
            // Continue only if the File was successfully created
            if (photoFile != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
            }
        }

        startActivityForResult(takePictureIntent, Contants.RESULT_CAMERA_IMAGE);//跳转界面传回拍照所得数据
    }


   /* private File createImageFile() {
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        File image = null;
        try {
            image = File.createTempFile(
                    generateFileName(),  *//* prefix *//*
                    ".jpg",         *//* suffix *//*
                    storageDir      *//* directory *//*
            );
        } catch (IOException e) {
            e.printStackTrace();
        }

        String  mCurrentPhotoPath = image.getAbsolutePath();
        return image;
    }

    public static String generateFileName() {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        return imageFileName;
    }*/


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK ) {


            if (requestCode == Contants.RESULT_LOAD_IMAGE) {
                Uri selectedImage = data.getData();
                tempUri = selectedImage;

            }else if (requestCode == Contants.RESULT_CAMERA_IMAGE){

                Uri uri = Uri.fromFile(photoFile);
                tempUri = uri;
            }


            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                //申请WRITE_EXTERNAL_STORAGE权限
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }else{

                try {
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempUri));
                    upload_pic.setImageBitmap(bitmap);
                    upload_pic.setVisibility(View.VISIBLE);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }


        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempUri));
                        upload_pic.setImageBitmap(bitmap);
                        upload_pic.setVisibility(View.VISIBLE);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {
                    Toast.makeText(this, "deny", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }



    // 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
    @SuppressLint("NewApi")
    public static String getPathByUri4kitkat(final Context context, final Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            if (isExternalStorageDocument(uri)) {// ExternalStorageProvider
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(uri)) {// DownloadsProvider
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } else if (isMediaDocument(uri)) {// MediaProvider
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[] { split[1] };
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore
            // (and
            // general)
            return getDataColumn(context, uri, null, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
            return uri.getPath();
        }
        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context
     *            The context.
     * @param uri
     *            The Uri to query.
     * @param selection
     *            (Optional) Filter used in the query.
     * @param selectionArgs
     *            (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = { column };
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }


    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
}

 

上传异步任务:

import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import zpwmall.com.tms.ui.WeightActivity;
import zpwmall.com.tms.utils.MyApplication;

/**
 * Created by Administrator on 2018/6/13.
 */
public class UploadAsyncTask extends AsyncTask<String, Integer, String> {

    private String imagePath;

    private WeightActivity context;

    public UploadAsyncTask(){}

    public UploadAsyncTask(WeightActivity context,String path){
        this.imagePath = path;
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... param) {
        OkHttpClient mOkHttpClient = new OkHttpClient();

        String result = "error";
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.addFormDataPart("image", imagePath,
                RequestBody.create(MediaType.parse("image/jpeg"), new File(imagePath)));
        RequestBody requestBody = builder.build();
        Request.Builder reqBuilder = new Request.Builder();
        Request request = reqBuilder
                .url("http://xx/itemUpload")
                .post(requestBody)
                .build();

        Log.d("UploadAsyncTask", "请求地址 http://xx/itemUpload");
        try{
            Response response = mOkHttpClient.newCall(request).execute();
            Log.d("UploadAsyncTask", "响应码 " + response.code());
            if (response.isSuccessful()) {
                String resultValue = response.body().string();
                Log.d("UploadAsyncTask", "响应体 " + resultValue);
                return resultValue;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
       JSONObject json = JSONObject.parseObject(result);
        Log.i("result", result);
        if (json.getString("ret").equals("true")) {
            Toast.makeText(MyApplication.getContext(), "上传成功!", Toast.LENGTH_SHORT).show();

        }else{
            Toast.makeText(MyApplication.getContext(), "上传失败!", Toast.LENGTH_SHORT).show();
        }

    }
}

 

 

..

 

  • 大小: 215 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics