mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-22 00:32:55 +08:00
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cordova-android
This commit is contained in:
commit
d3b7903af8
@ -42,6 +42,7 @@ import android.graphics.Bitmap;
|
|||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.media.MediaScannerConnection;
|
import android.media.MediaScannerConnection;
|
||||||
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@ -396,19 +397,21 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
(destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {
|
(destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {
|
||||||
this.callbackContext.success(uri.toString());
|
this.callbackContext.success(uri.toString());
|
||||||
} else {
|
} else {
|
||||||
|
String uriString = uri.toString();
|
||||||
// Get the path to the image. Makes loading so much easier.
|
// Get the path to the image. Makes loading so much easier.
|
||||||
String imagePath = FileHelper.getRealPath(uri, this.cordova);
|
String mimeType = FileHelper.getMimeType(uriString, this.cordova);
|
||||||
String mimeType = FileHelper.getMimeType(imagePath, this.cordova);
|
|
||||||
// Log.d(LOG_TAG, "Real path = " + imagePath);
|
|
||||||
// Log.d(LOG_TAG, "mime type = " + mimeType);
|
|
||||||
// If we don't have a valid image so quit.
|
// If we don't have a valid image so quit.
|
||||||
if (imagePath == null || mimeType == null ||
|
if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
|
||||||
!(mimeType.equalsIgnoreCase("image/jpeg") || mimeType.equalsIgnoreCase("image/png"))) {
|
|
||||||
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
||||||
this.failPicture("Unable to retrieve path to picture!");
|
this.failPicture("Unable to retrieve path to picture!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Bitmap bitmap = getScaledBitmap(imagePath);
|
Bitmap bitmap = null;
|
||||||
|
try {
|
||||||
|
bitmap = getScaledBitmap(uriString);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
if (bitmap == null) {
|
if (bitmap == null) {
|
||||||
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
||||||
this.failPicture("Unable to create bitmap!");
|
this.failPicture("Unable to create bitmap!");
|
||||||
@ -417,7 +420,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
if (this.correctOrientation) {
|
if (this.correctOrientation) {
|
||||||
String[] cols = { MediaStore.Images.Media.ORIENTATION };
|
String[] cols = { MediaStore.Images.Media.ORIENTATION };
|
||||||
Cursor cursor = this.cordova.getActivity().getContentResolver().query(intent.getData(),
|
Cursor cursor = this.cordova.getActivity().getContentResolver().query(uri,
|
||||||
cols, null, null, null);
|
cols, null, null, null);
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
cursor.moveToPosition(0);
|
cursor.moveToPosition(0);
|
||||||
@ -563,17 +566,18 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
*
|
*
|
||||||
* @param imagePath
|
* @param imagePath
|
||||||
* @return
|
* @return
|
||||||
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private Bitmap getScaledBitmap(String imagePath) {
|
private Bitmap getScaledBitmap(String imageUrl) throws IOException {
|
||||||
// If no new width or height were specified return the original bitmap
|
// If no new width or height were specified return the original bitmap
|
||||||
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
||||||
return BitmapFactory.decodeFile(imagePath);
|
return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova));
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out the original width and height of the image
|
// figure out the original width and height of the image
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inJustDecodeBounds = true;
|
options.inJustDecodeBounds = true;
|
||||||
BitmapFactory.decodeFile(imagePath, options);
|
BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
|
|
||||||
//CB-2292: WTF? Why is the width null?
|
//CB-2292: WTF? Why is the width null?
|
||||||
if(options.outWidth == 0 || options.outHeight == 0)
|
if(options.outWidth == 0 || options.outHeight == 0)
|
||||||
@ -587,7 +591,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// Load in the smallest bitmap possible that is closest to the size we want
|
// Load in the smallest bitmap possible that is closest to the size we want
|
||||||
options.inJustDecodeBounds = false;
|
options.inJustDecodeBounds = false;
|
||||||
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
||||||
Bitmap unscaledBitmap = BitmapFactory.decodeFile(imagePath, options);
|
Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
if (unscaledBitmap == null) {
|
if (unscaledBitmap == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@ import org.apache.cordova.api.LOG;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
public class FileHelper {
|
public class FileHelper {
|
||||||
private static final String LOG_TAG = "FileUtils";
|
private static final String LOG_TAG = "FileUtils";
|
||||||
@ -92,7 +94,8 @@ public class FileHelper {
|
|||||||
Uri uri = Uri.parse(uriString);
|
Uri uri = Uri.parse(uriString);
|
||||||
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
||||||
} else if (uriString.startsWith("file:///android_asset/")) {
|
} else if (uriString.startsWith("file:///android_asset/")) {
|
||||||
String relativePath = uriString.substring(22);
|
Uri uri = Uri.parse(uriString);
|
||||||
|
String relativePath = uri.getPath().substring(15);
|
||||||
return cordova.getActivity().getAssets().open(relativePath);
|
return cordova.getActivity().getAssets().open(relativePath);
|
||||||
} else {
|
} else {
|
||||||
return new FileInputStream(getRealPath(uriString, cordova));
|
return new FileInputStream(getRealPath(uriString, cordova));
|
||||||
@ -122,14 +125,18 @@ public class FileHelper {
|
|||||||
public static String getMimeType(String uriString, CordovaInterface cordova) {
|
public static String getMimeType(String uriString, CordovaInterface cordova) {
|
||||||
String mimeType = null;
|
String mimeType = null;
|
||||||
|
|
||||||
|
Uri uri = Uri.parse(uriString);
|
||||||
if (uriString.startsWith("content://")) {
|
if (uriString.startsWith("content://")) {
|
||||||
Uri uri = Uri.parse(uriString);
|
|
||||||
mimeType = cordova.getActivity().getContentResolver().getType(uri);
|
mimeType = cordova.getActivity().getContentResolver().getType(uri);
|
||||||
} else {
|
} else {
|
||||||
// MimeTypeMap.getFileExtensionFromUrl has a bug that occurs when the filename has a space, so we encode it.
|
// MimeTypeMap.getFileExtensionFromUrl() fails when there are query parameters.
|
||||||
// We also convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
|
String extension = uri.getPath();
|
||||||
String encodedUriString = uriString.replace(" ", "%20").toLowerCase();
|
int lastDot = extension.lastIndexOf('.');
|
||||||
String extension = MimeTypeMap.getFileExtensionFromUrl(encodedUriString);
|
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();
|
||||||
if (extension.equals("3ga")) {
|
if (extension.equals("3ga")) {
|
||||||
mimeType = "audio/3gpp";
|
mimeType = "audio/3gpp";
|
||||||
} else {
|
} else {
|
||||||
|
@ -24,11 +24,12 @@ import java.io.InputStream;
|
|||||||
import org.apache.cordova.api.CordovaInterface;
|
import org.apache.cordova.api.CordovaInterface;
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
|
|
||||||
import android.content.res.AssetManager;
|
import android.annotation.TargetApi;
|
||||||
import android.net.Uri;
|
import android.os.Build;
|
||||||
import android.webkit.WebResourceResponse;
|
import android.webkit.WebResourceResponse;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
||||||
|
|
||||||
|
|
||||||
@ -43,34 +44,20 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
|||||||
@Override
|
@Override
|
||||||
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
||||||
if(url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url)){
|
if(url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url)){
|
||||||
return generateWebResourceResponse(url);
|
WebResourceResponse ret = generateWebResourceResponse(url);
|
||||||
} else {
|
if (ret != null) {
|
||||||
return super.shouldInterceptRequest(view, url);
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return super.shouldInterceptRequest(view, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WebResourceResponse generateWebResourceResponse(String url) {
|
private WebResourceResponse generateWebResourceResponse(String url) {
|
||||||
final String ANDROID_ASSET = "file:///android_asset/";
|
if (url.startsWith("file:///android_asset/")) {
|
||||||
if (url.startsWith(ANDROID_ASSET)) {
|
String mimetype = FileHelper.getMimeType(url, cordova);
|
||||||
String niceUrl = url;
|
|
||||||
niceUrl = url.replaceFirst(ANDROID_ASSET, "");
|
|
||||||
if(niceUrl.contains("?")){
|
|
||||||
niceUrl = niceUrl.split("\\?")[0];
|
|
||||||
}
|
|
||||||
if(niceUrl.contains("#"))
|
|
||||||
{
|
|
||||||
niceUrl = niceUrl.split("#")[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
String mimetype = null;
|
|
||||||
if(niceUrl.endsWith(".html")){
|
|
||||||
mimetype = "text/html";
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
AssetManager assets = cordova.getActivity().getAssets();
|
InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova);
|
||||||
Uri uri = Uri.parse(niceUrl);
|
|
||||||
InputStream stream = assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING);
|
|
||||||
WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
|
WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
|
||||||
return response;
|
return response;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user