[ 
https://issues.apache.org/jira/browse/CB-5398?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13975215#comment-13975215
 ] 

Randy Lau commented on CB-5398:
-------------------------------

Julian - having the same issue as well.  

I tried merging in their changes to IceCreamCordovaWebViewClient.java.  This 
change fixed a GET error I saw before the change: 
("GET content://com.android.providers.media.documents/document/image%3A13966"). 
 

However, I'm still getting the Android permissions issue: 
("java.lang.SecurityException: Permission Denial: reading 
com.android.providers.media.MediaDocumentsProvider uri 
content://com.android.providers.media.documents/document/image:13966 from 
pid=10618, uid=10287 requires android.permission.MANAGE_DOCUMENTS, or 
grantUriPermission()")   

Am I missing something?  I have the MANAGE_DOCUMENTS and INTERNET permissions 
in my AndroidManifest.xml as well.

IceCreamCordovaWebViewClient.java code below:
package org.apache.cordova;

import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaResourceApi.OpenForReadResult;
import org.apache.cordova.LOG;

import android.annotation.TargetApi;
import android.net.Uri;
import android.os.Build;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {

    private static final String TAG = "IceCreamCordovaWebViewClient";

    public IceCreamCordovaWebViewClient(CordovaInterface cordova) {
        super(cordova);
    }
    
    public IceCreamCordovaWebViewClient(CordovaInterface cordova, 
CordovaWebView view) {
        super(cordova, view);
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) 
{
        try {
            // Check the against the white-list.
            if ((url.startsWith("http:") || url.startsWith("https:")) && 
!Config.isUrlWhiteListed(url)) {
                LOG.w(TAG, "URL blocked by whitelist: " + url);
                // Results in a 404.
                return new WebResourceResponse("text/plain", "UTF-8", null);
            }

            CordovaResourceApi resourceApi = appView.getResourceApi();
            Uri origUri = Uri.parse(url);
            // Allow plugins to intercept WebView requests.
            Uri remappedUri = resourceApi.remapUri(origUri);
            
            if (!origUri.equals(remappedUri) || 
needsSpecialsInAssetUrlFix(origUri) || needsKitKatContentUrlFix(origUri)) {
                OpenForReadResult result = resourceApi.openForRead(remappedUri, 
true);
                return new WebResourceResponse(result.mimeType, "UTF-8", 
result.inputStream);
            }
            // If we don't need to special-case the request, let the browser 
load it.
            return null;
        } catch (IOException e) {
            if (!(e instanceof FileNotFoundException)) {
                LOG.e("IceCreamCordovaWebViewClient", "Error occurred while 
loading a file (returning a 404).", e);
            }
            // Results in a 404.
            return new WebResourceResponse("text/plain", "UTF-8", null);
        }
    }

    private static boolean needsKitKatContentUrlFix(Uri uri) {
        return android.os.Build.VERSION.SDK_INT >= 
android.os.Build.VERSION_CODES.KITKAT && "content".equals(uri.getScheme());
    }

    private static boolean needsSpecialsInAssetUrlFix(Uri uri) {
        if (CordovaResourceApi.getUriType(uri) != 
CordovaResourceApi.URI_TYPE_ASSET) {
            return false;
        }
        if (uri.getQuery() != null || uri.getFragment() != null) {
            return true;
        }
        
        if (!uri.toString().contains("%")) {
            return false;
        }

        switch(android.os.Build.VERSION.SDK_INT){
            case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH:
            case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1:
                return true;
        }
        return false;
    }
}


> Pick image from Library or Photo album on android 4.4
> -----------------------------------------------------
>
>                 Key: CB-5398
>                 URL: https://issues.apache.org/jira/browse/CB-5398
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android, Plugin Camera
>    Affects Versions: 2.9.0, 3.2.0
>         Environment: android 4.4
>            Reporter: julio cesar
>            Assignee: Mike Billau
>             Fix For: 3.5.0
>
>
> An android 4.4 try to pick a photo using pictureSource.PHOTOLIBRARY or 
> pictureSource.SAVEDPHOTOALBUM and return type destinationType.FILE_URI.
> Now android 4.4, when you select the above options, it opens an "open from" 
> dialog that  let you choose from new places as "Recent", "Drive", "Images" 
> and "Downloads" (the names might not be the same as I use the device in 
> spanish and translated it).
> If you choose any of them, you get an error, AndroidProtocolHandler, unable 
> to open content URL: the url here with a content://com.android.providers 
> format.
> I've tested on phonegap 2.9 because this is the version I use, but I suppose 
> it affects all of them. (in fact I use 2.9.1)



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to