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

Posted zhangjianying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机型 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();
            
        
    



以上是关于华为机型 cordova-plugin-camera从图库获取报错的主要内容,如果未能解决你的问题,请参考以下文章

ARFoundation系列讲解 - 89 适配华为机型

ARFoundation系列讲解 - 89 适配华为机型

华为手机分为几个档次都以什么为代表?

安卓9.0到!华为&荣耀9款机型内测招募开启!

HarmonyOS 2首批正式版升级后Mate40系列等18款机型开启了扑克时间129263的OS系统

HarmonyOS 2首批正式版升级后Mate40系列等18款机型开启了扑克时间129263的OS系统