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: [email protected] <[email protected]>
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 <[email protected]>
Date: 2015-12-01T20:27:10Z
m: response to code reivew on pull request 141
commit 83978ea3736168520eae2935ee0318d6fb9bc7c3
Author: [email protected] <[email protected]>
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 [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]