CB-4889
This commit is contained in:
commit
ed86de0d2a
20
plugin.xml
20
plugin.xml
@ -3,7 +3,7 @@
|
|||||||
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
id="org.apache.cordova.camera"
|
id="org.apache.cordova.camera"
|
||||||
version="0.2.1">
|
version="0.2.2-dev">
|
||||||
<name>Camera</name>
|
<name>Camera</name>
|
||||||
<description>Cordova Camera Plugin</description>
|
<description>Cordova Camera Plugin</description>
|
||||||
<license>Apache 2.0</license>
|
<license>Apache 2.0</license>
|
||||||
@ -35,6 +35,8 @@
|
|||||||
</config-file>
|
</config-file>
|
||||||
|
|
||||||
<source-file src="src/android/CameraLauncher.java" target-dir="src/org/apache/cordova/camera" />
|
<source-file src="src/android/CameraLauncher.java" target-dir="src/org/apache/cordova/camera" />
|
||||||
|
<source-file src="src/android/FileHelper.java" target-dir="src/org/apache/cordova/camera" />
|
||||||
|
<source-file src="src/android/ExifHelper.java" target-dir="src/org/apache/cordova/camera" />
|
||||||
|
|
||||||
<js-module src="www/CameraPopoverHandle.js" name="CameraPopoverHandle">
|
<js-module src="www/CameraPopoverHandle.js" name="CameraPopoverHandle">
|
||||||
<clobbers target="CameraPopoverHandle" />
|
<clobbers target="CameraPopoverHandle" />
|
||||||
@ -122,9 +124,7 @@
|
|||||||
<!-- windows8 -->
|
<!-- windows8 -->
|
||||||
<platform name="windows8">
|
<platform name="windows8">
|
||||||
|
|
||||||
<dependency id="org.apache.cordova.core.file"
|
<dependency id="org.apache.cordova.file" />
|
||||||
url="https://git-wip-us.apache.org/repos/asf/cordova-plugin-file"
|
|
||||||
commit="master" subdir="/" />
|
|
||||||
<config-file target="package.appxmanifest" parent="/Package/Capabilities">
|
<config-file target="package.appxmanifest" parent="/Package/Capabilities">
|
||||||
<Capability Name="picturesLibrary" />
|
<Capability Name="picturesLibrary" />
|
||||||
<DeviceCapability Name="webcam" />
|
<DeviceCapability Name="webcam" />
|
||||||
@ -138,4 +138,16 @@
|
|||||||
|
|
||||||
</platform>
|
</platform>
|
||||||
|
|
||||||
|
<!-- firefoxos -->
|
||||||
|
<platform name="firefoxos">
|
||||||
|
<config-file target="config.xml" parent="/*">
|
||||||
|
<feature name="Camera">
|
||||||
|
<param name="firefoxos-package" value="Camera" />
|
||||||
|
</feature>
|
||||||
|
</config-file>
|
||||||
|
<js-module src="src/firefoxos/CameraProxy.js" name="CameraProxy">
|
||||||
|
<runs />
|
||||||
|
</js-module>
|
||||||
|
</platform>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
||||||
|
@ -26,9 +26,6 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.cordova.ExifHelper;
|
|
||||||
import org.apache.cordova.DirectoryManager;
|
|
||||||
import org.apache.cordova.FileHelper;
|
|
||||||
import org.apache.cordova.CallbackContext;
|
import org.apache.cordova.CallbackContext;
|
||||||
import org.apache.cordova.CordovaPlugin;
|
import org.apache.cordova.CordovaPlugin;
|
||||||
import org.apache.cordova.LOG;
|
import org.apache.cordova.LOG;
|
||||||
@ -95,23 +92,6 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
private MediaScannerConnection conn; // Used to update gallery app with newly-written files
|
private MediaScannerConnection conn; // Used to update gallery app with newly-written files
|
||||||
private Uri scanMe; // Uri of image to be added to content store
|
private Uri scanMe; // Uri of image to be added to content store
|
||||||
|
|
||||||
//This should never be null!
|
|
||||||
//private CordovaInterface cordova;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*/
|
|
||||||
public CameraLauncher() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// public void setContext(CordovaInterface mCtx) {
|
|
||||||
// super.setContext(mCtx);
|
|
||||||
// if (CordovaInterface.class.isInstance(mCtx))
|
|
||||||
// cordova = (CordovaInterface) mCtx;
|
|
||||||
// else
|
|
||||||
// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the request and returns PluginResult.
|
* Executes the request and returns PluginResult.
|
||||||
*
|
*
|
||||||
@ -182,6 +162,24 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// LOCAL METHODS
|
// LOCAL METHODS
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
private String getTempDirectoryPath() {
|
||||||
|
File cache = null;
|
||||||
|
|
||||||
|
// SD Card Mounted
|
||||||
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
|
cache = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
|
||||||
|
"/Android/data/" + cordova.getActivity().getPackageName() + "/cache/");
|
||||||
|
}
|
||||||
|
// Use internal storage
|
||||||
|
else {
|
||||||
|
cache = cordova.getActivity().getCacheDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the cache directory if it doesn't exist
|
||||||
|
cache.mkdirs();
|
||||||
|
return cache.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take a picture with the camera.
|
* Take a picture with the camera.
|
||||||
* When an image is captured or the camera view is cancelled, the result is returned
|
* When an image is captured or the camera view is cancelled, the result is returned
|
||||||
@ -224,9 +222,9 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
private File createCaptureFile(int encodingType) {
|
private File createCaptureFile(int encodingType) {
|
||||||
File photo = null;
|
File photo = null;
|
||||||
if (encodingType == JPEG) {
|
if (encodingType == JPEG) {
|
||||||
photo = new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), ".Pic.jpg");
|
photo = new File(getTempDirectoryPath(), ".Pic.jpg");
|
||||||
} else if (encodingType == PNG) {
|
} else if (encodingType == PNG) {
|
||||||
photo = new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), ".Pic.png");
|
photo = new File(getTempDirectoryPath(), ".Pic.png");
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
|
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
|
||||||
}
|
}
|
||||||
@ -290,7 +288,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
ExifHelper exif = new ExifHelper();
|
ExifHelper exif = new ExifHelper();
|
||||||
try {
|
try {
|
||||||
if (this.encodingType == JPEG) {
|
if (this.encodingType == JPEG) {
|
||||||
exif.createInFile(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/.Pic.jpg");
|
exif.createInFile(getTempDirectoryPath() + "/.Pic.jpg");
|
||||||
exif.readExifData();
|
exif.readExifData();
|
||||||
rotate = exif.getOrientation();
|
rotate = exif.getOrientation();
|
||||||
}
|
}
|
||||||
@ -331,7 +329,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
||||||
uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova)));
|
uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova)));
|
||||||
} else {
|
} else {
|
||||||
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
|
uri = Uri.fromFile(new File(getTempDirectoryPath(), System.currentTimeMillis() + ".jpg"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
@ -451,7 +449,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
if (this.targetHeight > 0 && this.targetWidth > 0) {
|
if (this.targetHeight > 0 && this.targetWidth > 0) {
|
||||||
try {
|
try {
|
||||||
// Create an ExifHelper to save the exif data that is lost during compression
|
// Create an ExifHelper to save the exif data that is lost during compression
|
||||||
String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
String resizePath = getTempDirectoryPath() + "/resize.jpg";
|
||||||
// Some content: URIs do not map to file paths (e.g. picasa).
|
// Some content: URIs do not map to file paths (e.g. picasa).
|
||||||
String realPath = FileHelper.getRealPath(uri, this.cordova);
|
String realPath = FileHelper.getRealPath(uri, this.cordova);
|
||||||
ExifHelper exif = new ExifHelper();
|
ExifHelper exif = new ExifHelper();
|
||||||
@ -749,6 +747,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
}
|
}
|
||||||
Uri uri = Uri.parse(contentStore + "/" + id);
|
Uri uri = Uri.parse(contentStore + "/" + id);
|
||||||
this.cordova.getActivity().getContentResolver().delete(uri, null, null);
|
this.cordova.getActivity().getContentResolver().delete(uri, null, null);
|
||||||
|
cursor.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
185
src/android/ExifHelper.java
Normal file
185
src/android/ExifHelper.java
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.cordova.camera;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import android.media.ExifInterface;
|
||||||
|
|
||||||
|
public class ExifHelper {
|
||||||
|
private String aperture = null;
|
||||||
|
private String datetime = null;
|
||||||
|
private String exposureTime = null;
|
||||||
|
private String flash = null;
|
||||||
|
private String focalLength = null;
|
||||||
|
private String gpsAltitude = null;
|
||||||
|
private String gpsAltitudeRef = null;
|
||||||
|
private String gpsDateStamp = null;
|
||||||
|
private String gpsLatitude = null;
|
||||||
|
private String gpsLatitudeRef = null;
|
||||||
|
private String gpsLongitude = null;
|
||||||
|
private String gpsLongitudeRef = null;
|
||||||
|
private String gpsProcessingMethod = null;
|
||||||
|
private String gpsTimestamp = null;
|
||||||
|
private String iso = null;
|
||||||
|
private String make = null;
|
||||||
|
private String model = null;
|
||||||
|
private String orientation = null;
|
||||||
|
private String whiteBalance = null;
|
||||||
|
|
||||||
|
private ExifInterface inFile = null;
|
||||||
|
private ExifInterface outFile = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The file before it is compressed
|
||||||
|
*
|
||||||
|
* @param filePath
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void createInFile(String filePath) throws IOException {
|
||||||
|
this.inFile = new ExifInterface(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The file after it has been compressed
|
||||||
|
*
|
||||||
|
* @param filePath
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void createOutFile(String filePath) throws IOException {
|
||||||
|
this.outFile = new ExifInterface(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads all the EXIF data from the input file.
|
||||||
|
*/
|
||||||
|
public void readExifData() {
|
||||||
|
this.aperture = inFile.getAttribute(ExifInterface.TAG_APERTURE);
|
||||||
|
this.datetime = inFile.getAttribute(ExifInterface.TAG_DATETIME);
|
||||||
|
this.exposureTime = inFile.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
|
||||||
|
this.flash = inFile.getAttribute(ExifInterface.TAG_FLASH);
|
||||||
|
this.focalLength = inFile.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
|
||||||
|
this.gpsAltitude = inFile.getAttribute(ExifInterface.TAG_GPS_ALTITUDE);
|
||||||
|
this.gpsAltitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF);
|
||||||
|
this.gpsDateStamp = inFile.getAttribute(ExifInterface.TAG_GPS_DATESTAMP);
|
||||||
|
this.gpsLatitude = inFile.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
|
||||||
|
this.gpsLatitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
|
||||||
|
this.gpsLongitude = inFile.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
|
||||||
|
this.gpsLongitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
|
||||||
|
this.gpsProcessingMethod = inFile.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD);
|
||||||
|
this.gpsTimestamp = inFile.getAttribute(ExifInterface.TAG_GPS_TIMESTAMP);
|
||||||
|
this.iso = inFile.getAttribute(ExifInterface.TAG_ISO);
|
||||||
|
this.make = inFile.getAttribute(ExifInterface.TAG_MAKE);
|
||||||
|
this.model = inFile.getAttribute(ExifInterface.TAG_MODEL);
|
||||||
|
this.orientation = inFile.getAttribute(ExifInterface.TAG_ORIENTATION);
|
||||||
|
this.whiteBalance = inFile.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the previously stored EXIF data to the output file.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void writeExifData() throws IOException {
|
||||||
|
// Don't try to write to a null file
|
||||||
|
if (this.outFile == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.aperture != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_APERTURE, this.aperture);
|
||||||
|
}
|
||||||
|
if (this.datetime != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_DATETIME, this.datetime);
|
||||||
|
}
|
||||||
|
if (this.exposureTime != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_EXPOSURE_TIME, this.exposureTime);
|
||||||
|
}
|
||||||
|
if (this.flash != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_FLASH, this.flash);
|
||||||
|
}
|
||||||
|
if (this.focalLength != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_FOCAL_LENGTH, this.focalLength);
|
||||||
|
}
|
||||||
|
if (this.gpsAltitude != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, this.gpsAltitude);
|
||||||
|
}
|
||||||
|
if (this.gpsAltitudeRef != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF, this.gpsAltitudeRef);
|
||||||
|
}
|
||||||
|
if (this.gpsDateStamp != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, this.gpsDateStamp);
|
||||||
|
}
|
||||||
|
if (this.gpsLatitude != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_LATITUDE, this.gpsLatitude);
|
||||||
|
}
|
||||||
|
if (this.gpsLatitudeRef != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, this.gpsLatitudeRef);
|
||||||
|
}
|
||||||
|
if (this.gpsLongitude != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, this.gpsLongitude);
|
||||||
|
}
|
||||||
|
if (this.gpsLongitudeRef != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, this.gpsLongitudeRef);
|
||||||
|
}
|
||||||
|
if (this.gpsProcessingMethod != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD, this.gpsProcessingMethod);
|
||||||
|
}
|
||||||
|
if (this.gpsTimestamp != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP, this.gpsTimestamp);
|
||||||
|
}
|
||||||
|
if (this.iso != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_ISO, this.iso);
|
||||||
|
}
|
||||||
|
if (this.make != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_MAKE, this.make);
|
||||||
|
}
|
||||||
|
if (this.model != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_MODEL, this.model);
|
||||||
|
}
|
||||||
|
if (this.orientation != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_ORIENTATION, this.orientation);
|
||||||
|
}
|
||||||
|
if (this.whiteBalance != null) {
|
||||||
|
this.outFile.setAttribute(ExifInterface.TAG_WHITE_BALANCE, this.whiteBalance);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.outFile.saveAttributes();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOrientation() {
|
||||||
|
int o = Integer.parseInt(this.orientation);
|
||||||
|
|
||||||
|
if (o == ExifInterface.ORIENTATION_NORMAL) {
|
||||||
|
return 0;
|
||||||
|
} else if (o == ExifInterface.ORIENTATION_ROTATE_90) {
|
||||||
|
return 90;
|
||||||
|
} else if (o == ExifInterface.ORIENTATION_ROTATE_180) {
|
||||||
|
return 180;
|
||||||
|
} else if (o == ExifInterface.ORIENTATION_ROTATE_270) {
|
||||||
|
return 270;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetOrientation() {
|
||||||
|
this.orientation = "" + ExifInterface.ORIENTATION_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
158
src/android/FileHelper.java
Normal file
158
src/android/FileHelper.java
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/*
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.cordova.camera;
|
||||||
|
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.webkit.MimeTypeMap;
|
||||||
|
|
||||||
|
import org.apache.cordova.CordovaInterface;
|
||||||
|
import org.apache.cordova.LOG;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class FileHelper {
|
||||||
|
private static final String LOG_TAG = "FileUtils";
|
||||||
|
private static final String _DATA = "_data";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the real path of the given URI string.
|
||||||
|
* If the given URI string represents a content:// URI, the real path is retrieved from the media store.
|
||||||
|
*
|
||||||
|
* @param uriString the URI string of the audio/image/video
|
||||||
|
* @param cordova the current application context
|
||||||
|
* @return the full path to the file
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public static String getRealPath(String uriString, CordovaInterface cordova) {
|
||||||
|
String realPath = null;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the real path of the given URI.
|
||||||
|
* If the given URI is a content:// URI, the real path is retrieved from the media store.
|
||||||
|
*
|
||||||
|
* @param uri the URI of the audio/image/video
|
||||||
|
* @param cordova the current application context
|
||||||
|
* @return the full path to the file
|
||||||
|
*/
|
||||||
|
public static String getRealPath(Uri uri, CordovaInterface cordova) {
|
||||||
|
return FileHelper.getRealPath(uri.toString(), cordova);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an input stream based on given URI string.
|
||||||
|
*
|
||||||
|
* @param uriString the URI string from which to obtain the input stream
|
||||||
|
* @param cordova the current application context
|
||||||
|
* @return an input stream into the data at the given URI or null if given an invalid URI string
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
|
||||||
|
if (uriString.startsWith("content")) {
|
||||||
|
Uri uri = Uri.parse(uriString);
|
||||||
|
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
||||||
|
} else if (uriString.startsWith("file://")) {
|
||||||
|
int question = uriString.indexOf("?");
|
||||||
|
if (question > -1) {
|
||||||
|
uriString = uriString.substring(0,question);
|
||||||
|
}
|
||||||
|
if (uriString.startsWith("file:///android_asset/")) {
|
||||||
|
Uri uri = Uri.parse(uriString);
|
||||||
|
String relativePath = uri.getPath().substring(15);
|
||||||
|
return cordova.getActivity().getAssets().open(relativePath);
|
||||||
|
} else {
|
||||||
|
return new FileInputStream(getRealPath(uriString, cordova));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new FileInputStream(getRealPath(uriString, cordova));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the "file://" prefix from the given URI string, if applicable.
|
||||||
|
* If the given URI string doesn't have a "file://" prefix, it is returned unchanged.
|
||||||
|
*
|
||||||
|
* @param uriString the URI string to operate on
|
||||||
|
* @return a path without the "file://" prefix
|
||||||
|
*/
|
||||||
|
public static String stripFileProtocol(String uriString) {
|
||||||
|
if (uriString.startsWith("file://")) {
|
||||||
|
uriString = uriString.substring(7);
|
||||||
|
}
|
||||||
|
return uriString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getMimeTypeForExtension(String path) {
|
||||||
|
String extension = path;
|
||||||
|
int lastDot = extension.lastIndexOf('.');
|
||||||
|
if (lastDot != -1) {
|
||||||
|
extension = extension.substring(lastDot + 1);
|
||||||
|
}
|
||||||
|
// Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
|
||||||
|
extension = extension.toLowerCase(Locale.getDefault());
|
||||||
|
if (extension.equals("3ga")) {
|
||||||
|
return "audio/3gpp";
|
||||||
|
}
|
||||||
|
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the mime type of the data specified by the given URI string.
|
||||||
|
*
|
||||||
|
* @param uriString the URI string of the data
|
||||||
|
* @return the mime type of the specified data
|
||||||
|
*/
|
||||||
|
public static String getMimeType(String uriString, CordovaInterface cordova) {
|
||||||
|
String mimeType = null;
|
||||||
|
|
||||||
|
Uri uri = Uri.parse(uriString);
|
||||||
|
if (uriString.startsWith("content://")) {
|
||||||
|
mimeType = cordova.getActivity().getContentResolver().getType(uri);
|
||||||
|
} else {
|
||||||
|
mimeType = getMimeTypeForExtension(uri.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
return mimeType;
|
||||||
|
}
|
||||||
|
}
|
52
src/firefoxos/CameraProxy.js
Normal file
52
src/firefoxos/CameraProxy.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function getPicture(cameraSuccess, cameraError, cameraOptions) {
|
||||||
|
cameraError = cameraError || function(){};
|
||||||
|
var pick = new MozActivity({
|
||||||
|
name: "pick",
|
||||||
|
data: {
|
||||||
|
type: ["image/png", "image/jpg", "image/jpeg"]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
pick.onerror = cameraError;
|
||||||
|
pick.onsuccess = function() {
|
||||||
|
// image is returned as Blob in this.result.blob
|
||||||
|
// we need to call cameraSuccess with url or base64 encoded image
|
||||||
|
if (cameraOptions && cameraOptions.destinationType == 0) {
|
||||||
|
// TODO: base64
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!cameraOptions || !cameraOptions.destinationType || cameraOptions.destinationType > 0) {
|
||||||
|
// url
|
||||||
|
return cameraSuccess(window.URL.createObjectURL(this.result.blob));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getPicture: getPicture,
|
||||||
|
cleanup: function(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
require("cordova/firefoxos/commandProxy").add("Camera", module.exports);
|
@ -150,9 +150,11 @@ static NSSet* org_apache_cordova_validArrowDirections;
|
|||||||
NSDictionary* options = [command.arguments objectAtIndex:10 withDefault:nil];
|
NSDictionary* options = [command.arguments objectAtIndex:10 withDefault:nil];
|
||||||
[self displayPopover:options];
|
[self displayPopover:options];
|
||||||
} else {
|
} else {
|
||||||
if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) {
|
SEL selector = NSSelectorFromString(@"presentViewController:animated:completion:");
|
||||||
|
if ([self.viewController respondsToSelector:selector]) {
|
||||||
[self.viewController presentViewController:cameraPicker animated:YES completion:nil];
|
[self.viewController presentViewController:cameraPicker animated:YES completion:nil];
|
||||||
} else {
|
} else {
|
||||||
|
// deprecated as of iOS >= 6.0
|
||||||
[self.viewController presentModalViewController:cameraPicker animated:YES];
|
[self.viewController presentModalViewController:cameraPicker animated:YES];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user