GitHub user sencenan opened a pull request:

    https://github.com/apache/cordova-plugin-camera/pull/143

    [CB-10093][CB-9960][android] fix error resolving content uri to file url

    fixing: https://issues.apache.org/jira/browse/CB-10093
    
    Different app returns different uri. This is causing getRealPath() to 
return empty path.
    
    Fixed:
    
    - Gallery: content://media/external/images/media/117209
    - Google Photo: embeds a external image link inside another uri
    - Dropbox: old school file url
    
    Not fixed:
    
    - Google Drive: document uri, but has no document id, or the id cannot be 
used to query content resolver
    
    Notes:
    
    I have tested with: Gallery, Dropbox, Google Photo, and various file 
manager apps. However, this fix as is still does not address the problem with 
Google Drive.
    
    It seems to me that trying to get real file path from content uri seems to 
be a fundamentally flawed solution. It breaks the google sandbox between apps 
and this is going to get worse when more apps start to return the URL in 
"non-standard" formats.
    
    Use getContentResolver().openInputStream() and read the file directly could 
be a way forward, given that we are copying the image file already.
    
    For reference, I am using this following hack for my own branch to address 
problem with Google Drive:
    
    ```java
    private String ouputModifiedBitmap(Bitmap bitmap, Uri uri) throws 
IOException {
            // Some content: URIs do not map to file paths (e.g. picasa).
            String realPath = FileHelper.getRealPath(uri, this.cordova);
    
            //START OF HACK
            if (realPath.length() == 0) {
                String copiedFilePath = getTempDirectoryPath() + "/"
                        + System.currentTimeMillis() + ".copied."
                        + (this.encodingType == JPEG ? "jpg" : "png");
    
                InputStream fin = 
this.cordova.getActivity().getContentResolver().openInputStream(uri);
                OutputStream fout = new FileOutputStream(copiedFilePath);
    
                byte[] buf = new byte[1024 * 4];
                int len;
    
                while ((len = fin.read(buf)) > 0) {
                    fout.write(buf, 0, len);
                }
    
                fin.close();
                fout.close();
    
                realPath = copiedFilePath;
            }
            //END OF HACK
    
            // rest of ouputModifiedBitmap method
    }
    ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/sencenan/cordova-plugin-camera master

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/cordova-plugin-camera/pull/143.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #143
    
----
commit c09a8cf09b371c6071256444b81b18c10b3b70af
Author: sen.ce...@gmail.com <sen.ce...@gmail.com>
Date:   2015-11-30T20:18:03Z

    m: fix the crash when the uri passed into outputModifiedBitmap() is not a 
document URI

commit 05cdb0133f53fff109298ac2fb10a89026bb6462
Author: sencenan <sen.ce...@gmail.com>
Date:   2015-12-01T20:27:10Z

    m: response to code reivew on pull request 141

commit 83978ea3736168520eae2935ee0318d6fb9bc7c3
Author: sen.ce...@gmail.com <sen.ce...@gmail.com>
Date:   2015-12-03T05:49:47Z

    [CB-10093][CB-9960][android] fix error resolving content uri to file url

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@cordova.apache.org
For additional commands, e-mail: dev-h...@cordova.apache.org

Reply via email to