android 相册 裁剪 提示失败

在做相册图裁剪时,针对系统4.4及以上时,如果快速的保存裁剪图片,系统会提示“图片保存时失败。”(用nexus 6测试)等待1s后,再保存,无问题。

可能原因:系统有相应时间。

不知大家有没有遇到过,可以尝试一下。

下面是通用的相册裁剪源码:

布局自己写吧!

来源(比较复杂):https://github.com/ZBJDSBJ/CameraDemo/blob/master/src/com/zou/camerademo/MainActivity.java



import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

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.security.DomainCombiner;


public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    //保存图片本地路径
    public static final String ACCOUNT_DIR = Environment.getExternalStorageDirectory().getPath()
            + "/account/";
    public static final String ACCOUNT_MAINTRANCE_ICON_CACHE = "icon_cache/";
    private static final String IMGPATH = ACCOUNT_DIR + ACCOUNT_MAINTRANCE_ICON_CACHE;

//    private static final String IMAGE_FILE_NAME = "faceImage.jpeg";
    private static final String TMP_IMAGE_FILE_NAME = "tmp_faceImage.jpeg";

    public static final int SET_ALBUM_PICTURE_KITKAT = 40;
    public static final int SELECET_A_PICTURE_AFTER_KIKAT = 50;
    private static final int CHOOSE_BIG_PICTURE = 1001;
    private static final int CHOOSE_SMALL_PICTURE = 1002;
    private ImageView id;
    private ImageView imageView;
    private String TAG = "HHB";

    final boolean mIsKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

    private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file
    Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap
    File filetwo = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        id = (ImageView) findViewById(R.id.id_image);
        Button bt = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.id_imageview);
        File directory = new File(ACCOUNT_DIR);
        File imagepath = new File(IMGPATH);
        if (!directory.exists()) {
            Log.e("zou", "directory.mkdir()");
            directory.mkdir();
        }else{
            Log.e("zou", "存在 directory.mkdir()");
        }
        if (!imagepath.exists()) {
            Log.e("zou", "imagepath.mkdir()");
            imagepath.mkdir();
        }else{
            Log.e("zou", "存在 imagepath.mkdir()");
        }

        filetwo = new File(IMGPATH, TMP_IMAGE_FILE_NAME);
        try {
            if (filetwo.exists()) {
                filetwo.delete();
            }
            filetwo.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);

                ComponentName componentName = new ComponentName("com.lakala.credit", "com.lakala.credit.activity.SplashActivity");
                intent.setComponent(componentName);
                startActivity(intent);

            }
        });

//        BuilderMode mode = new BuilderMode.Builder().title("builderTitle").msg("builderMsg").build();
//        BuilderMode mode = new BuilderMode.Builder().build();
//        Toast.makeText(this,"msg:"+mode.getMsg()+",title:"+mode.getTitle(),Toast.LENGTH_LONG).show();
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        switch (v.getId()) {
            case R.id.id_photo_big_button:
                if (mIsKitKat) {
                    selectImageUriAfterKikat();
                } else {
                    intent.setType("image/*");

                    intent.putExtra("crop", "true");

                    intent.putExtra("aspectX", 2);

                    intent.putExtra("aspectY", 1);

                    intent.putExtra("outputX", 600);

                    intent.putExtra("outputY", 300);

                    intent.putExtra("scale", true);

                    intent.putExtra("return-data", false);

                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

                    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

                    intent.putExtra("noFaceDetection", true); // no face detection

                    startActivityForResult(intent, CHOOSE_BIG_PICTURE);
                }
                break;
            case R.id.id_photo_small_button:
//                Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT, null);
                if (mIsKitKat) {
                    selectImageUriAfterKikat();
                } else {
                    intent.setType("image/*");

                    intent.putExtra("crop", "true");

                    intent.putExtra("aspectX", 1);

                    intent.putExtra("aspectY", 1);

                    intent.putExtra("outputX", 180);

                    intent.putExtra("outputY", 180);

                    intent.putExtra("scale", true);

                    intent.putExtra("return-data", true);

                    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

                    intent.putExtra("noFaceDetection", true); // no face detection

                    startActivityForResult(intent, CHOOSE_SMALL_PICTURE);
                }

                break;

        }
    }

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

        if (resultCode != RESULT_OK) {
            return;
        }

        switch (requestCode) {
            //获取相册原始图片
            case SELECET_A_PICTURE_AFTER_KIKAT:
                if (null != data) {
                    String mAlbumPicturePath = getPath(getApplicationContext(), data.getData());
                    cropImageUriAfterKikat(Uri.fromFile(new File(mAlbumPicturePath)));
                }
                break;
            //获取相册裁剪图片
            case SET_ALBUM_PICTURE_KITKAT:
//                Bitmap bitmap = decodeUriAsBitmap(Uri.fromFile(new File(IMGPATH, TMP_IMAGE_FILE_NAME)));
                imageView.setImageBitmap(decodeUriAsBitmap(Uri.fromFile(new File(IMGPATH, TMP_IMAGE_FILE_NAME))));
                break;
            case CHOOSE_BIG_PICTURE:

                if (imageUri != null) {
                    imageView.setImageBitmap(decodeUriAsBitmap(imageUri));
                }
                break;
            case CHOOSE_SMALL_PICTURE:
                if (data != null) {
                    Bitmap bitmap = data.getParcelableExtra("data");
                    imageView.setImageBitmap(bitmap);

                }

                break;

            default:

                break;

        }
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                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];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                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);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                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);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * <br>功能简述:4.4以上裁剪图片方法实现---------------------- 相册
     * <br>功能详细描述:
     * <br>注意:
     */
    private void selectImageUriAfterKikat() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");

        startActivityForResult(intent, SELECET_A_PICTURE_AFTER_KIKAT);
    }
    /**
     * <br>功能简述: 4.4及以上改动版裁剪图片方法实现 --------------------相册
     * <br>功能详细描述:
     * <br>注意:
     * @param uri
     */
    private void cropImageUriAfterKikat(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/jpeg");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 180);
        intent.putExtra("outputY", 180);
        intent.putExtra("scale", true);
        //    intent.putExtra("return-data", true);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(new File(IMGPATH, TMP_IMAGE_FILE_NAME)));
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, SET_ALBUM_PICTURE_KITKAT);
    }

    /**
     * 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 index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    private Bitmap decodeUriAsBitmap(Uri uri) {

        Bitmap bitmap = null;

        try {

            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

        } catch (FileNotFoundException e) {

            e.printStackTrace();

            return null;

        }

        return bitmap;

    }

    private void getMax() {
        String[] name = {"A", "B", "C", "D", "E", "F", "G"};
        int[] weight = {35, 30, 60, 50, 40, 10, 25};
        int[] price = {10, 40, 30, 50, 35, 40, 30};

    }

    class Test extends AsyncTask<String, String, String> {


        @Override
        protected String doInBackground(String... params) {
            sysout();

            return null;
        }
    }

    float zhu = 0.222f;
    int maxCount = 20000;
    float get = 0;
    float shui = 0.0f;

    private void sysout() {
        for (int i = 3500; i < maxCount; i = i + 50) {
            int sheng = (int) (i - 3500 - i * zhu);
            if (sheng <= 1500 && sheng > 0) {
                shui = (float) (sheng * 0.03);
            }
            if (1500 < sheng && sheng <= 4500) {
                shui = (float) (1500 * 0.03) + (float) ((sheng - 1500) * 0.1);
            }
            if (4500 < sheng && sheng <= 9000) {
                shui = (float) (1500 * 0.03) + (float) ((sheng - 1500) * 0.1) + (float) ((sheng - 4500) * 0.2);
            }
            if (9000 < sheng && sheng <= 35000) {
                shui = (float) (1500 * 0.03) + (float) ((sheng - 1500) * 0.1) + (float) ((sheng - 4500) * 0.2) + (float) ((sheng - 9000) * 0.25);
            }
            get = i - i * zhu - shui;
            Log.d("HHB", "总额:" + i + "  ,税:" + shui + "  ,住:" + (int) (i * zhu) + "  ,剩:" + get);
        }
    }

    public String bitmaptoString(Bitmap bitmap) {


        // 将Bitmap转换成字符串

        String string = null;

        ByteArrayOutputStream bStream = new ByteArrayOutputStream();

        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bStream);

        byte[] bytes = bStream.toByteArray();

        string = Base64.encodeToString(bytes, Base64.DEFAULT);

        return string;

    }

    public String get(String string) {

        String str = "";
        str = string.split(";base64,")[1];

        return str;
    }

    public Bitmap stringtoBitmap(String string) {

        // 将字符串转换成Bitmap类型

        Bitmap bitmap = null;

        try {

            byte[] bitmapArray;

            bitmapArray = Base64.decode(string, Base64.DEFAULT);

            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0,

                    bitmapArray.length);

        } catch (Exception e) {

            e.printStackTrace();

        }


        return bitmap;

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Android图片裁剪的示例代码: ```java // 引用[1] // 在AndroidManifest.xml文件中添加权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> // 在Activity中调用图片裁剪功能 private static final int REQUEST_CODE_PICK_IMAGE = 1; private static final int REQUEST_CODE_CROP_IMAGE = 2; private Uri mImageUri; // 启动图片选择器 private void pickImage() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); } // 处理图片选择结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK) { mImageUri = data.getData(); cropImage(); } else if (requestCode == REQUEST_CODE_CROP_IMAGE && resultCode == RESULT_OK) { // 处理裁剪后的图片 Bitmap bitmap = BitmapFactory.decodeFile(mImageUri.getPath()); // 显示裁剪后的图片 imageView.setImageBitmap(bitmap); } } // 启动图片裁剪 private void cropImage() { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageUri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩小浪~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值