我正在使用科尔多瓦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的新手
每当一些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
进行了两次解码。
看到这个回答:
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 );
}
试试这个。。
在相机插件中有一个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并发送到服务器。现在我想把一张图片放在图库中的用户选择上。 我的代码如下: