Não é possível definir a origem da imagem ao acessar imagem da galeria-Android
-
21-12-2019 - |
Pergunta
Iam usar cordova 3.4.Quando eu capturar uma imagem e defini-lo,seu trabalho bem, mas quando eu tento acessar imagem da galeria de eu obter o url
content://com.android.providers.media.documents/document/image%4A463
e eu fico imagem carregar erro na minha imagem de marca.Eu sei que este é um bug aí e eu tenho chamado de pilha de perguntas, tais como Não é possível carregar a imagem quando selecionada a partir da galeria do Android 4.4 (KitKat) usando o PhoneGap Câmara Plugin
Eu não posso usar a trabalho áspero em torno mencionado, onde a URI é definida manualmente como conteúdo://media/externo/images/media/ porque nós foco dispositivos internos construído em armazenamento, tais como Moto
Também você pode por favor confirmar que este problema foi corrigido no cordova 3.5.Porque eu precisar de uma permissão de meus funcionários para download e o que eu deve certificar-se que ele seja realizável .Alguém pode ajudar por favor
ATUALIZAÇÃO:
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
}
);
});
}
};
});
Meu HTML:
<img
ng-src="{{onepic}}"
width="250"
height="390"
alt="error"/>
Eu definir o valor para onepic no meu controlador dentro da função de relógio.Então, quando directiva retorna um URI será automaticamente definido em onepic.Por favor, especifique qualquer solução alternativa ou se Iam fazendo nada de errado ,Iam de novo para angularjs
Solução
Tente isso..
Na Câmara Plugin não é um FileHelper.java
Arquivo, Substitua o plugin getRealPath
com o meu presente o meu método.
Para mais detalhes você pode seguir este -> https://issues.apache.org/jira/browse/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;
}
No CameraLauncher.java
Classe therer é um método processResultFromGallery
private void processResultFromGallery
Encontrar este código:
if (this.targetHeight == -1 && this.targetWidth == -1 &&
(destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation){
this.callbackContext.success(uri.toString());
}
E troque por isso:
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);
}
Outras dicas
ver este resposta:
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 );
}
Sempre que algum uri
é passado para <img src="uri" />
é implicitamente decodificada a partir de
conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem%3A9888 (1)
em
conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem:9888 (2)
No entanto, depois de voltar da Intent.ACTION_OPEN_DOCUMENT
ou Intent.ACTION_GET_CONTENT
O Android fornece-lhe a permissão de leitura para (1), não (2).Neste caso, WebView
vai com expectativa de log de erro:
o java.lang.SecurityException:Negação De Permissão:leitura com.android.provedores.meios de comunicação.MediaDocumentsProvider uri conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem:9888 a partir pid=13163, uid=10165 requer android.permissão.MANAGE_DOCUMENTS, ou grantUriPermission()
ou
Não é possível abrir o conteúdo de URL
Snippet de código
Tudo o que você precisa para resolver a questão é
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;
}
}
no seu código Java antes de passar uri
em HTML/JS para garantir que (1) vai ser carregados.
Eu testei que em 4.4.2, 4.4.4 e 5.0.A parte engraçada é que o Android 4.4.2 decodifica o uri
internamente, duas vezes.