【问题标题】:Unable to set image source when accessing image from gallery-Android从图库-Android 访问图像时无法设置图像源
【发布时间】:2014-06-04 12:30:16
【问题描述】:

我正在使用科尔多瓦 3.4。当我捕获图像并设置它时,它工作正常但是当我尝试从画廊访问图像时,我得到了 url

content://com.android.providers.media.documents/document/image%4A463

我的图像标签中出现图像加载错误。我知道这是一个已知的错误,我参考了堆栈问题,例如Unable to load image when selected from the gallery on Android 4.4 (KitKat) using PhoneGap Camera Plugin

我不能使用提到的手动设置 URI 的粗略工作,例如 content://media/external/images/media/,因为我们专注于具有内部内置存储的设备,例如 Moto

您还可以确认此问题已在 cordova 3.5 中得到修复。因为我需要我的官员的许可才能下载,我必须确保它是可以实现的。有人可以帮忙

更新:

app.directive('upload', function() {
return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
        elm.on('click', function() {
            navigator.camera.getPicture(
                    function(imageURI) {
                        scope.$apply(function() {
                            alert(imageURI);
                               ctrl.$setViewValue(imageURI);
                        });
                        window.resolveLocalFileSystemURI(imageURI, function(fileEntry)                                                                       {
                             //                                                   ctrl.$setViewValue(imageURI);
                            alert("inside local file" + imageURI);
                            alert("Inside local file system");
                            fileEntry.file(function(fileObj) {
                                alert("hai");
                                var options = new FileUploadOptions();
                                options.fileKey = "file";
                                options.fileName = fileObj.name;
                                options.mimeType = fileObj.type;
                                var ft = new FileTransfer();
                                // var url = fileUploadUrl;
                                // ft.upload(imageUri, encodeURI(url), success,                 failure, options);
                            });
                        });
                    },
                    function(err) {
                        ctrl.$setValidity('error', false);
                    }, {quality: 50,
                destinationType: Camera.DestinationType.FILE_URI,
                  sourceType: Camera.PictureSourceType.PHOTOLIBRARY
            }
            );
        });
    }
};
       });

我的 HTML:

  <img
                    ng-src="{{onepic}}" 
                    width="250" 
                    height="390" 
                    alt="error"/>

我在 watch 函数中的控制器中为 onepic 设置了值。因此,当指令返回一个 URI 时,它将自动在 onepic 中设置。请指定任何替代解决方案,或者如果我做错了什么,我是 angularjs 的新手

【问题讨论】:

    标签: android image cordova cordova-3 cordova-plugins


    【解决方案1】:

    试试这个..

    在Camera Plugin中有一个FileHelper.java文件,用我的这个我的方法替换插件getRealPath

    更多详情你可以关注这个->https://issues.apache.org/jira/browse/CB-5398

    FileHelper.java

        @SuppressWarnings("deprecation")
        public static String getRealPath(String uriString, CordovaInterface cordova) {
            String realPath = null;
    
    
            final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    
            // DocumentProvider
            if (isKitKat) {
            Cursor cursor =  cordova.getActivity().getContentResolver().query(Uri.parse(uriString), null, null, null, null);
            cursor.moveToFirst();
            String document_id = cursor.getString(0);
            document_id = document_id.substring(document_id.lastIndexOf(":")+1);
            cursor.close();
    
            cursor = cordova.getActivity().getContentResolver().query( 
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
            cursor.moveToFirst();
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            realPath = path;
            cursor.close();
            }else{
    
            if (uriString.startsWith("content://")) {
                String[] proj = { _DATA };
                Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow(_DATA);
                cursor.moveToFirst();
                realPath = cursor.getString(column_index);
                if (realPath == null) {
                    LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString);
                }
            } else if (uriString.startsWith("file://")) {
                realPath = uriString.substring(7);
                if (realPath.startsWith("/android_asset/")) {
                    LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString);
                    realPath = null;
                }
            } else {
                realPath = uriString;
            }
    
            }
            return realPath;
        }
    

    CameraLauncher.java 类中有一种方法processResultFromGallery

    private void processResultFromGallery
    

    找到这个代码:

        if (this.targetHeight == -1 && this.targetWidth == -1 &&
                    (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation){
    
            this.callbackContext.success(uri.toString());
        }
    

    并替换为:

        if (this.targetHeight == -1 && this.targetWidth == -1 &&
                    (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {
    
                String s    =FileHelper.getRealPath(uri.toString(), cordova);
                Log.i("test","<<<<ifURI::::::"+s +"URI::::" + uri.toString());
                this.callbackContext.success(s);
    
         }  
    

    【讨论】:

    • 感谢您的回复,但是它仍然无法在我的应用页面中设置图像
    • 我使用 angularjs 指令来使用插件。当我注释掉源类型时,我能够捕获图像并将其设置在我的图像标签中。但是如果我为画廊指定源类型,我可以访问画廊,但同时设置图像我得到图像未加载符号并显示替代文本
    • 非常感谢你,伙计。你是一个救生员。它奏效了
    • 嘿伙计。你的代码运行良好,但现在当我尝试使用我的应用拍照时......应用停止工作并退出应用。你能说什么错
    • 刚刚从 cameraLauncher.java 对 Filehelper.java 使用了两个不同的函数调用....使用您的函数访问画廊和使用 cordova 的原始函数进行相机..这解决了我的问题
    【解决方案2】:

    this 答案:

        if (imageUri.toString().substring(0,21).equals("content://com.android")) {
              String [] photo_split= imageUri.toString().split("%3A");
              String imageUriBasePath = "content://media/external/images/media/"+photo_split[1];
               imageUri= Uri.parse(imageUriBasePath );
    
            }
    

    【讨论】:

      【解决方案3】:

      每当一些uri 被传递到&lt;img src="uri" /&gt; 时,它都会被隐式解码

      content://com.android.providers.media.documents/document/image%3A9888 (1)

      进入

      content://com.android.providers.media.documents/document/image:9888 (2)

      但是,从Intent.ACTION_OPEN_DOCUMENTIntent.ACTION_GET_CONTENT 返回后,Android 为您提供(1) 的读取权限,而不是(2)。在这种情况下,WebView 会期望记录一个错误:

      java.lang.SecurityException: Permission Denial: 读取 com.android.providers.media.MediaDocumentsProvider URI 内容://com.android.providers.media.documents/document/image:9888 从 pid=13163, uid=10165 需要 android.permission.MANAGE_DOCUMENTS 或 grantUriPermission()

      无法打开内容网址

      代码 sn-p

      你只需要解决这个问题就是

          String uriToUseInWebView = transformForWebView(uri.toString());
      
          private String transformForWebView(String uri) {
              for (int i = 0; i < timesDecodingWebView(); i++)
                  uri = uri.replace("%", Uri.encode("%"));
              return uri;
          }
      
          private int timesDecodingWebView() {
              if (Build.VERSION.RELEASE.equals("4.4.2")) {
                  return 2;
              } else {
                  return 1;
              }
          }
      

      在您的 Java 代码中传递 uri 到 HTML/JS 之前,以确保 (1) 将被实际加载。

      我已经在 4.4.2、4.4.4 和 5.0 上进行了测试。有趣的是,Android 4.4.2 在内部对uri 进行了两次解码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        相关资源
        最近更新 更多