如何从Bitmap(Lollipop)获取Uri

时间:2015-05-12 20:45:35

标签: android bitmap uri android-bitmap

好的,我试过这段代码:

public Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
        return Uri.parse(path);
    }

看起来无法完成这项工作。当我记录它时会打印出来:

content://media/external/images/media/25756

这对我没有帮助,因为我需要new File(Uri)。奇怪的是,getImageUri方法返回Uri,但File似乎无法识别它。任何人都有从新制作的位图中检索Uri的方法吗?

P.S。据我所知,自KitKat以来它不起作用。

修改 这段代码有用,我想从中检索Uri:

                croppedBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                cropImageView = (CropImageView) findViewById(R.id.CropImageView);
                cropImageView.setImageBitmap(croppedBitmap);


       Button crop = ...;
       crop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cropContainer.setVisibility(View.GONE);
                mImageView.setVisibility(View.VISIBLE);
                Bitmap croppedImage = cropImageView.getCroppedImage();
                mImageView.setImageBitmap(croppedImage);
                paramsContener.setVisibility(View.VISIBLE);
            }
        });

2 个答案:

答案 0 :(得分:1)

  

看起来无法完成这项工作

这将取决于“工作”是什么。

  

当我记录它时会打印:content://media/external/images/media/25756这对我没有帮助,因为我需要它用于新文件(Uri)

首先,如果要将位图保存到文件,请使用FileOutputStream而不是ByteArrayOutputStream。 Java文件I / O已经存在了大约20年。

其次,如果您希望从ContentProvider MediaStore获取文件路径,那么您会感到失望。您回复Uri,就像问题中的content://一样。 A Uri is not a file。使用ContentResolveropenInputStream()等方法读取Uri标识的数据。表示通过流获得的东西的不透明句柄的“URI”的概念至少与HTTP一样长,已经存在了大约25年。

  

奇怪的是,getImageUri方法返回Uri,但File似乎无法识别它。

这是因为Uri不是文件。

答案 1 :(得分:1)

好的,我得到了感谢@CommonsWare - 做了这样的事情。希望也会帮助另一个人:

    module.service('$Validation', ["$compile",function($compile){

        this.validators = {
            'phoneNumber': [['required', 1], ['minlength',6], ['maxlength', 10], ['pattern', /^[0-9]+$/.source]],
            'phoneNumber2Custom': function(value){ 
                return /^[0-9]{6,10}$/.test(value) 
            },
            'userTwitter': function(value){
                return /^@(.+)/.test(value)
            }
            // ...etc... /
        }

        this.add = function(scope, element, attrs, model){
            var name = attrs.bkNgValidation, type;
            if(!(type = this.validators[name])) return;
            else if(angular.isFunction(type)) return (model.$validators[name] = type);

            element.removeAttr("bk-ng-validation");
            angular.forEach(type, function(expr){
                element.attr(expr[0], expr[1])
            });
            $compile(element)(scope)        
        };

    }]).directive('bkNgValidation', ["$Validation", function ($Validation) {
        return {
            require: '?ngModel',
            priority: 1e5,
            link: function(){
                $Validation.add.apply($Validation, arguments);
            }
        }
    }])