غير قادر على تعيين مصدر الصورة عند الوصول إلى صورة من معرض-الروبوت
-
21-12-2019 - |
سؤال
إدارة الهوية والولوج باستخدام كوردوفا 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
داخليا مرتين.