华为机型 cordova-plugin-camera从图库获取报错

华为的系统执行如下代码从图库中获取图片会报错.

navigator.camera.getPicture(function(imageURI){
			alert(imageURI);
			resolveLocalFileSystemURL(imageURI, function(entry) {
				alert('cdvfile URI: ' + entry.toInternalURL());

				 document.querySelector("#aa").src = entry.toInternalURL();//将图片在html img中显示出来
			});

		},
		function(message){

		}
		, { quality: 50,
		    destinationType: Camera.DestinationType.FILE_URI ,
		    sourceType:Camera.PictureSourceType.SAVEDPHOTOALBUM

		}

经过排查发现华为默认的图片浏览返回的是 "com.android.providers.media.documents"

所以要修改 cordova-plugin-camera 插件中的 CameraLauncher.java 文件

增加:

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

/**
     * Applies all needed transformation to the image received from the gallery.
     *
     * @param destType          In which form should we return the image
     * @param intent            An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
     */
    private void processResultFromGallery(int destType, Intent intent) {
        Uri uri = intent.getData();
        if (uri == null) {
            if (croppedUri != null) {
                uri = croppedUri;
            } else {
                this.failPicture("null data from photo library");
                return;
            }
        }
        int rotate = 0;

        // If you ask for video or all media type you will automatically get back a file URI
        // and there will be no attempt to resize any returned data
        if (this.mediaType != PICTURE) {
            this.callbackContext.success(uri.toString());
        }
        else {
            // This is a special case to just return the path as no scaling,
            // rotating, nor compressing needs to be done
            if (this.targetHeight == -1 && this.targetWidth == -1 &&
                    (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {

            	if(isMediaDocument(uri)){
            		  String realPath = FileHelper.getRealPath(uri, this.cordova);
            		    this.callbackContext.success("file://" + realPath);
            	}else{
            	     this.callbackContext.success(uri.toString());
            	}

            } else {
                String uriString = uri.toString();
                // Get the path to the image. Makes loading so much easier.
                String mimeType = FileHelper.getMimeType(uriString, this.cordova);
                // If we don't have a valid image so quit.
                if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
                    Log.d(LOG_TAG, "I either have a null image path or bitmap");
                    this.failPicture("Unable to retrieve path to picture!");
                    return;
                }
                Bitmap bitmap = null;
                try {
                    bitmap = getScaledBitmap(uriString);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (bitmap == null) {
                    Log.d(LOG_TAG, "I either have a null image path or bitmap");
                    this.failPicture("Unable to create bitmap!");
                    return;
                }

                if (this.correctOrientation) {
                    rotate = getImageOrientation(uri);
                    if (rotate != 0) {
                        Matrix matrix = new Matrix();
                        matrix.setRotate(rotate);
                        try {
                            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                            this.orientationCorrected = true;
                        } catch (OutOfMemoryError oom) {
                            this.orientationCorrected = false;
                        }
                    }
                }

                // If sending base64 image back
                if (destType == DATA_URL) {
                    this.processPicture(bitmap);
                }

                // If sending filename back
                else if (destType == FILE_URI || destType == NATIVE_URI) {
                    // Did we modify the image?
                    if ( (this.targetHeight > 0 && this.targetWidth > 0) ||
                            (this.correctOrientation && this.orientationCorrected) ) {
                        try {
                            String modifiedPath = this.ouputModifiedBitmap(bitmap, uri);
                            // The modified image is cached by the app in order to get around this and not have to delete you
                            // application cache I'm adding the current system time to the end of the file url.
                            this.callbackContext.success("file://" + modifiedPath + "?" + System.currentTimeMillis());
                        } catch (Exception e) {
                            e.printStackTrace();
                            this.failPicture("Error retrieving image.");
                        }
                    }
                    else {
                        this.callbackContext.success(uri.toString());
                    }
                }
                if (bitmap != null) {
                    bitmap.recycle();
                    bitmap = null;
                }
                System.gc();
            }
        }
    }
时间: 2024-10-26 10:38:56

华为机型 cordova-plugin-camera从图库获取报错的相关文章

cordova plugin 插件开发

问题描述 cordova plugin 插件开发 我写了一个cordova 项目 现在如何把它封装成插件,刚接触我cordova

net-关于.NET HTTP的POST请求获取报文体的问题

问题描述 关于.NET HTTP的POST请求获取报文体的问题 在WCF中,用restful做接口,方法是调通了,问题在于获取文件流的时候,之前用WebService的时候,代码为: HttpRequest request = HttpContext.Current.Request; Stream reqStream = request.InputStream; StreamReader streamReader = new StreamReader(reqStream, System.Text

Windows基础排查之一 - 激活

前言 想必大家还记得,若干年前还在用Windows XP时候,为了折腾操作系统,不少人应该都尝试去网上找寻过各种密钥,由于针对不同激活方式有不同的安装镜像,当时找到方便使用的多是VOL密钥以及与之相匹配的VL版光盘镜像.从Windows Vista开始,微软改进了密钥管理办法,针对批量许可证客户推出了新的密钥类型:密钥管理服KMS(Key Management Service)以及多次激活密钥MAK(Multiple Activation Key).后者允许对应密钥能多次永久激活,而KMS主要针

通过SSH终端管理ESXI虚拟机

今天在ESXI上的一台windows系统的虚拟机(以下简称VM),突然nagios报警提示说:该机器发生故障. 既然问题出来了,就要解决.先在本机ping下那台VM,发现不能ping通.使用vsphere登录到ESXI,发现该VM还处于运行状态,但是无法远程进去,一直显示的是黑屏. 打算直接在ESXI上重启该机器,但是却提示如下的错误信息: 因为不想安装ESXI的其他管理工具,所以就打算通过ESXI的SSH直接重启VM. 通过SSH关闭VM有两种方法:一是使用ESXi命令行工具vim-cmd来关

JAVA反射獲取屬性名報錯

问题描述 JAVA反射獲取屬性名報錯 反射获取属性名异常,遍历明明存在,指定属性名获取却报错,求指点.代码如下: public class Test2 { private String column1; private List column2; public String getColumn1() { return column1; } public void setColumn1(String column1) { this.column1 = column1; } public List<

extjs+struts1 的form问题

问题描述 我们都知道extjs可以通过formPanel中的getForm提交数据给后台,但是问题来了,后台使用struts1的actionForm的继承类就是无法获取提交上来的值,通过request.getParameter倒是可以获取值,但是这样一个变量一个变量的那值实在太愚蠢了,我前台有68个变量...用这种方法,光写获取值就崩溃了...有没有什么好方法提供以下.使用UserListForm userListForm = (UserListForm) form;的方式获取报错如下:org.

华为揽获存储行业奥斯卡两项大奖

[天极网数据频道7月1日消息]华为在"SNW 2013中国"上揽获两项大奖.华为N9000大数据存储系统以及HVS高端存储系统获得了素有"存储行业奥斯卡"之称的"SNW2013 优秀产品奖". 全球领先的信息与通信解决方案供应商华为,27日在由全球网络存储工业协会(SNIA)和计算机世界报社共同主办的"SNW 2013中国"上揽获两项大奖,华为N9000大数据存储系统以及HVS高端存储系统获得了素有"存储行业奥斯卡&

传华为下半年将砍掉80%机型不再做超低端机

硅谷网讯 "过去,我们脑子里全是运营商,现在我可以说,以后运营商的超低端定制机,我是不打算玩了."华为消费者BG CEO余承东昨日接受南都专访时透露,今年下半年,华为机型会"砍掉"80%以上,总机型不会超过10款,启动精简战略的主要目的是赶超三星.苹果(94.96,&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;-0.16, -0.17%). "过去,我们脑子里全是

ionic cordova一次上传多张图片(类似input file提交表单)的实现方法_javascript技巧

我们可以通过cordova提供的插件调用摄像头或图库选择需要的图片上传,按cordova官方的方法,每次选择完后就直接上传,这并不符合用户的习惯,最好的用户习惯是用户选择完需要的图片,并可在本地预览,接着用户再次打开摄像头或图库再次选择图片,接着预览,对于不需要的图片删除,最后确定可以后,再一次性上传所有图片.显然这种方式,cordova是不支持,那要如何实现呢,以下是我的方法: 通过调用$cordovaImagePicker.getPictures该方法打开图库,获得图片的URL地址,ps:相