当前位置: 首页 > 知识库问答 >
问题:

从图库访问图像时无法设置图像源-Android

孟财
2023-03-14

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

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

我的图像标签中出现了图像加载错误。我知道这是一个已知的错误,我已经参考了堆栈问题,例如使用PhoneGap相机插件从Android 4.4(KitKat)的图库中选择时无法加载图像

我不能使用提到的URI手动设置的粗糙方法,如content://media/external/images/media/

另外,您能否确认此问题已在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"/>

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

共有3个答案

长孙沈义
2023-03-14

每当一些uri被传入

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

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

然而,从< code>Intent返回后。ACTION_OPEN_DOCUMENT或< code>Intent。ACTION _ GET _ CONTENT Android为您提供了(1)的读取权限,而不是(2)。在这种情况下,< code>WebView将会记录一个错误:

java.lang.SecurityException:权限拒绝:读取com.android.providers.media.MediaDocumentsProvideruricontent://com.android.providers.media.documents/document/image: 9888 from pid=13163, uid=10165需要android.permission.MANAGE_DOCUMENTS,或grantUriPersion()

无法打开内容URL

代码片段

你只需要解决这个问题

    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;
        }
    }

在将uri传递到超文本标记语言/JS之前的Java代码中,以确保(1)将被实际加载。

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

巢海
2023-03-14

看到这个回答:

    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 );

        }
郜昊苍
2023-03-14

试试这个。。

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

更多的细节,你可以按照这个-

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;
    }

在< code>CameraLauncher.java类中,有一个方法< code > processresultfromcelle

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);

     }  
 类似资料:
  • null 那个代码有什么问题?我不明白为什么不能将ImageRi发送到ImageView。我还验证了我正在传递给setImageURI函数的Uri值是正确的。

  • 我正在尝试加载存储在应用程序文件夹上的图像当我打开活动时,我从logcat收到了这个错误: 1-20 01:30:40.125 14331-14331/mx.eusaga。af W/ImageView:无法打开内容:content://mx.eusaga.af.fileprovider/imagenes/1-db384fa8-f28b-4595-abbf-d45d38fd4036.jpgjava.

  • 我设计了一个简单的表格。 其中我将一个面板作为contentPane,将一个JLabel作为LBLPanel。 但是当我尝试这样做时,它只显示图像的原始大小,这是自然的,我们必须手动设置图像大小来fed整个JLabel。 因此,下面是我使用JLabel的图标属性设置图像时由WindowBuilder生成的代码。 现在我的问题是我想把图像的大小设置为JLabel的大小,那么有什么直接的方法可以使用W

  • 我想使用共享命令从图库获取图像。 我目前的代码是: imageUri 的值为:content://media/external/images/media/37 但是函数“openInputStream”会抛出错误“java.io.FileNotFoundException”。 通过下面的函数,我得到了图像的真实路径。 但我不知道如何将其转换为位图。

  • 我需要设置公司代理,以便Docker可以从公共注册表下载图像。 我使用Ubuntu 12.04机器。我找到了这个答案,但是在Ubuntu 12.04中不存在。我该怎么做呢? 谢谢

  • 我正在做解析。com Android应用程序中,我将预定义/默认图像放入ParseFile并发送到服务器。现在我想把一张图片放在图库中的用户选择上。 我的代码如下: