غير قادر على تعيين مصدر الصورة عند الوصول إلى صورة من معرض-الروبوت

StackOverflow https://stackoverflow.com//questions/24037487

سؤال

إدارة الهوية والولوج باستخدام كوردوفا 3.4.عندما التقاط صورة وتعيينها ، تعمل بشكل جيد ولكن عندما أحاول الوصول إلى صورة من معرض أحصل على ورل

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

وأحصل على خطأ في تحميل الصورة في علامة الصورة الخاصة بي.وأنا أعلم أن هذا هو علة معرفة تدور ولقد أشار أسئلة كومة مثل غير قادر على تحميل الصورة عند اختيارها من معرض على الروبوت 4.4 (كيت كات) باستخدام فونيغاب كاميرا المساعد

لا أستطيع استخدام العمل الخام حول المذكورة حيث يتم تعيين أوري يدويا مثل المحتوى: / / وسائل الإعلام / الخارجية / الصور / وسائل الإعلام / لأننا نركز الأجهزة مع الداخلية بنيت في التخزين مثل موتو

كما يمكنك يرجى التأكد من أن هذه المسألة قد تم إصلاحها في كوردوفا 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
            }
            );
        });
    }
};
       });

أتش تي أم أل:

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

أنا تعيين قيمة ل أونيبيك في بلدي تحكم داخل ووتش function.So عندما يعود التوجيه أوري سيتم تعيين تلقائيا في أونيبيك.يرجى تحديد أي حل بديل أو إذا أنا أفعل أي شيء خاطئ ، أنا جديد إلى أنغولارجس

هل كانت مفيدة؟

المحلول

جرب هذا..

في البرنامج المساعد الكاميرا هناك واحد FileHelper.java ملف ، استبدال البرنامج المساعد getRealPath مع بلدي هذا الأسلوب بلدي.

لمزيد من التفاصيل يمكنك متابعة هذا - > https://issues.apache.org/jira/browse/CB-5398

مساعد الملفات.جافا

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

     }  

نصائح أخرى

شاهد هذا الجواب:

giveacodicetagpre.

كلما بعض uri يتم تمريره في <img src="uri" /> تم فك تشفيره ضمنيًا من

المحتوى://com.android.providers.media.documents/document/image%3A9888 (1)

داخل

المحتوى://com.android.providers.media.documents/document/image:9888 (2)

ومع ذلك، بعد العودة من Intent.ACTION_OPEN_DOCUMENT أو Intent.ACTION_GET_CONTENT يوفر لك Android إذن القراءة لـ (1), ، لا (2).في هذه الحالة WebView سيتم تسجيل خطأ بشكل متوقع:

java.lang.SecurityException:رفض الإذن:قراءة com.android.providers.media.mediadocumentsprovider محتوى URI: //com.android.providers.media.documents/document/image: 9888 من PID = 13163 ، UID = 10165 يتطلب Android.permission.manage_documents ، أو منح المنح ()

أو

غير قادر على فتح عنوان 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;
        }
    }

في كود Java الخاص بك قبل المرور uri إلى HTML/JS للتأكد من ذلك (1) سيتم تحميلها فعليا.

لقد اختبرت ذلك على 4.4.2، 4.4.4 و5.0.الجزء المضحك هو أن Android 4.4.2 يقوم بفك تشفير uri داخليا مرتين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top