Невозможно установить источник изображения при доступе к изображению из галереи — Android.
-
21-12-2019 - |
Вопрос
Я использую Кордову 3.4.Когда я захватываю изображение и устанавливаю его, оно работает нормально, но когда я пытаюсь получить доступ к изображению из галереи, я получаю URL-адрес
content://com.android.providers.media.documents/document/image%4A463
и я получаю ошибку загрузки изображения в своем теге изображения. Я знаю, что это известная ошибка, и я ссылался на такие вопросы по стеку, как Невозможно загрузить изображение при его выборе из галереи на Android 4.4 (KitKat) с помощью плагина камеры PhoneGap.
Я не могу использовать упомянутую грубую работу, где 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"/>
Я установил значение для onepic в моем контроллере внутри функции просмотра. Поэтому, когда директива возвращает URI, он будет автоматически установлен в onepic. Пожалуйста, укажите любое альтернативное решение, или если я делаю что-то не так, я новичок в angularjs
Решение
Попробуйте это ..
В плагине камеры есть один файл FileHelper.java
, замените плагин getRealPath
с моим этим моим методом.
Для более подробной информации вы можете следить за этим -> https://issues.apache.org/ jira / loowse / 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;
}
.
в генеракодицетагкоде класса Threer - один метод CameraLauncher.java
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);
}
. Другие советы
Посмотреть Это Ответ:
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 );
}
. Всякий раз, когда некоторые 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 Content: //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
внутренне дважды.