cordova - quirks - Impossibile caricare l'immagine se selezionata dalla galleria su Android 4.4(KitKat) utilizzando PhoneGap Camera Plugin




cordovaplugin camera (4)

Adobe mi assicura che questo problema verrà risolto in 3.5.0. Non è stato risolto in 3.4. Dato che la versione 3.5.0 sarà rilasciata a metà maggio, aspetterò fino ad allora.

Adobe afferma che non si trattava di una modifica che poteva essere apportata a livello di plugin. Era un cambiamento fondamentale nel codice Cordova. È troppo male ci è voluto così tanto tempo per loro di venire con questa soluzione.

AGGIORNAMENTO: Cordova 3.5.0 è stato rilasciato il 9 maggio. Puoi scaricarlo dal nodo bia e verificare se i problemi sono stati risolti.

Sto provando a impostare l'origine di un tag img nella mia app in base all'immagine scelta dalla galleria di immagini del dispositivo utilizzando il plug-in PhoneGap / Cordova Camera.

Ha funzionato in precedenza come previsto per le versioni precedenti di Android (3.3) e funziona perfettamente su iOS, ma ora non riesce a risolvere il percorso dell'immagine su 4.4 (KitKat).

Il percorso restituito per l'URL dell'immagine restituita è simile al seguente:

content://com.android.providers.media.documents/document/image%3A352

Quando uso questo percorso per impostare come immagine src tramite JavaScript, l'URL non può essere risolto e quindi produce un errore di caricamento. Non c'è alcun problema quando si scatta una foto con la fotocamera, sembra solo che si verifichi quando si sceglie un'immagine esistente dalla galleria.

Ho provato a codificare su base64 e ho anche provato il metodo menzionato nel documento resolveLocalFileSystemURI(); ma non ho avuto fortuna con questi. Ho anche provato a rimuovere il plug-in della fotocamera e a ricostruire l'app, ma nessuna gioia.

La mia ipotesi è che qualcosa sia cambiato con il modo in cui KitKat gestisce la galleria e il plug-in PhoneGap / Camera non è stato ancora aggiornato per questo.


Ecco una semplice soluzione a questo problema:

sostituisci questo:

content://com.android.providers.media.documents/document/image%3A352

da questo:

content://com.android.providers.media.documents/document/image%253A352

se usi JavaScript puoi usare questo codice:

var path = content://com.android.providers.media.documents/document/image%3A352;
path = path.replace("%", "%25");

questa tecnica forza l'uri a lasciar passare "% 3A" così com'è, senza cambiarlo in ":", spero che funzioni per te!


Ogni volta che qualche uri viene passato in <img src="uri" /> viene decodificato implicitamente da

content: //com.android.providers.media.documents/document/image%3A9888 (1)

in

contenuto: //com.android.providers.media.documents/document/image: 9888 (2)

Tuttavia, dopo essere tornato da Intent.ACTION_OPEN_DOCUMENT o Intent.ACTION_GET_CONTENT Android ti fornisce l'autorizzazione di lettura per (1) , non (2) . In questo caso, WebView registrerà un errore:

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content: //com.android.providers.media.documents/document/image: 9888 da pid = 13163, uid = 10165 richiede Android. permission.MANAGE_DOCUMENTS o grantUriPermission ()

o

Impossibile aprire l'URL del contenuto

Snippet di codice

Tutto ciò che serve per risolvere il problema è

    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;
        }
    }

nel codice Java prima di passare uri in HTML / JS per garantire che (1) venga effettivamente caricato.

L'ho provato su 4.4.2, 4.4.4 e 5.0. La parte divertente è che Android 4.4.2 decodifica l' uri internamente due volte.


Qualcosa si è rotto in Android 4.4 con la codifica URI delle immagini.

Un bug è stato presentato contro Cordova qui: https://issues.apache.org/jira/browse/CB-5398

Nella documentazione di getPicture , sotto la sezione Android Quicks, discute questo problema e fa riferimento a una domanda con una soluzione alternativa (modifica il codice java del plug-in Camera per forzarlo ad aprire l'app Gallery anziché l'app Storage Access Framework).

Sembra che un'altra cosa che potresti fare è impostare il tipo di destinazione su DATA_URL.