上传图片功能实现

1.如果没有相机权限,申请打开相机权限

if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},0);
}

2.如果相机权限被关闭提示开启权限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {
    //申请WRITE_EXTERNAL_STORAGE权限
    Toast.makeText(this,"请开启相机权限",Toast.LENGTH_SHORT).show();
    return;
}

3.startActivityForResult的使用方法

使用startActivityForResult(Intent intent, int requestCode)方法传入一个请求码(第二个参数)。请求码相当于一个标识符,根据不同的标识符可以在onActivityResult中实现不同的逻辑处理。例如以下代码:

@Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
             case PHOTO_REQUEST_CAREMA:
                 if (resultCode == RESULT_OK) {
                     Intent intent = new Intent("com.android.camera.action.CROP");
                     intent.setDataAndType(imageUri, "image/*");
                     intent.putExtra("scale", true);
                     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                     startActivityForResult(intent, CROP_PHOTO); // 启动裁剪程序
                 }
                 break;
             case CROP_PHOTO:
                 if (resultCode == RESULT_OK) {
                     try {
                         Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                 .openInputStream(imageUri));
                         picture.setImageBitmap(bitmap);
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     }
                 }
                 break;
             case ARRAY_PHOTO:
                 if (resultCode == RESULT_OK) {
                     try {
                         if(data != null) {
                             Uri uri = data.getData();
                             imageUri = uri;
                         }
                         Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                 .openInputStream(imageUri));
                         picture.setImageBitmap(bitmap);
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     }
                 }
                 break;
             default:
                 super.onActivityResult(requestCode, resultCode, data);
                 break;
         }
     }

在以上onActivityResult方法中,根据startActivityForResult中传入requestCode的不同实现不同的功能,例如以下代码传入requestCode == ARRAY_PHOTO。

public void openGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, ARRAY_PHOTO);
}

4.Enviroment类使用方法

其主要方法有:
getRootDirectory()---->/ 获取根目录
getDataDirectory()---->/data 获取data目录
getExternalStorageDirectory()—>/sdcard 获取sd卡目录
getDownloadCacheDirectory()—>/cache 获取下载文件的缓存目录
getExternalStorageState—>sdcard的状态,removed,unmounted,checking,nofs,mounted,mounted_ro,shared,unmountable,bad_removal

5.ContentResolver类使用方法

ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。
public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

6.上传图片、从相册选择照片以及图片裁剪功能实现

首先创建PhotoActivity类

public class PhotoActivity extends AppCompatActivity implements View.OnClickListener {
        public static final int PHOTO_REQUEST_CAREMA = 1;// 拍照
        public static final int CROP_PHOTO = 2;// 裁剪
        public static final int ARRAY_PHOTO = 3;// 相册选取
        private Button takePhoto;
        private ImageView picture;
        private Uri imageUri;

        public static File tempFile;


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

            takePhoto = (Button) findViewById(R.id.take_photo);
            picture = (ImageView) findViewById(R.id.picture);

            takePhoto.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.take_photo:
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
                        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},0);
                    }
                    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                            != PackageManager.PERMISSION_GRANTED) {
                        //申请WRITE_EXTERNAL_STORAGE权限
                        //Util.showToast(this,"请开启相机权限");
                        Toast.makeText(this,"请开启相机权限",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    openCamera(this);//拍照获取照片
                    //openGallery();//从相册选择照片
                    break;
            }
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
                case PHOTO_REQUEST_CAREMA:
                    if (resultCode == RESULT_OK) {
                        Intent intent = new Intent("com.android.camera.action.CROP");
                        intent.setDataAndType(imageUri, "image/*");
                        intent.putExtra("scale", true);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                        startActivityForResult(intent, CROP_PHOTO); // 启动裁剪程序
                    }
                    break;
                case CROP_PHOTO:
                    if (resultCode == RESULT_OK) {
                        try {
                            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                    .openInputStream(imageUri));
                            picture.setImageBitmap(bitmap);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case ARRAY_PHOTO:
                    if (resultCode == RESULT_OK) {
                        try {
                            if(data != null) {
                                Uri uri = data.getData();
                                imageUri = uri;
                            }
                            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                    .openInputStream(imageUri));
                            picture.setImageBitmap(bitmap);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                default:
                    super.onActivityResult(requestCode, resultCode, data);
                    break;
            }
        }

        public void openCamera(Activity activity) {
            //獲取系統版本
            int currentapiVersion = android.os.Build.VERSION.SDK_INT;
            // 激活相机
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 判断存储卡是否可以用,可用进行存储
            if (hasSdcard()) {
                SimpleDateFormat timeStampFormat = new SimpleDateFormat(
                        "yyyy_MM_dd_HH_mm_ss");
                String filename = timeStampFormat.format(new Date());
                tempFile = new File(Environment.getExternalStorageDirectory(),
                        filename + ".jpg");
                if (currentapiVersion < 24) {
                    // 从文件中创建uri
                    imageUri = Uri.fromFile(tempFile);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                } else {
                    //兼容android7.0 使用共享文件的形式
                    ContentValues contentValues = new ContentValues(1);
                    contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
                    //检查是否有存储权限,以免崩溃
                    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED) {
                        //申请WRITE_EXTERNAL_STORAGE权限
                        //Util.showToast(this,"请开启存储权限");
                        Toast.makeText(this,"请开启存储权限",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                }
            }
            // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
            activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
        }

        /*
         * 判断sdcard是否被挂载
         */
        public static boolean hasSdcard() {
            return Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED);
        }
        public void openGallery() {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, ARRAY_PHOTO);
        }

    }

然后创建对应的photo.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">
    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Take Photo" />

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</LinearLayout>




猜你喜欢

转载自blog.csdn.net/qq_36946446/article/details/83856933