提交 3e7159a1 authored 作者: JarvanMo's avatar JarvanMo

support image from content provider on Android

上级 6bebe60a
...@@ -15,10 +15,14 @@ ...@@ -15,10 +15,14 @@
*/ */
package com.jarvan.fluwx.utils; package com.jarvan.fluwx.utils;
import android.content.Context;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import com.jarvan.fluwx.constant.WeChatPluginImageSchema; import com.jarvan.fluwx.constant.WeChatPluginImageSchema;
import com.jarvan.fluwx.constant.WechatPluginKeys; import com.jarvan.fluwx.constant.WechatPluginKeys;
...@@ -56,22 +60,14 @@ public class ShareImageUtil { ...@@ -56,22 +60,14 @@ public class ShareImageUtil {
} }
} else if (path.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) { } else if (path.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
Bitmap bmp = null;
String pathWithoutUri = path.substring("file://".length()); String pathWithoutUri = path.substring("file://".length());
bmp = BitmapFactory.decodeFile(pathWithoutUri); result = fileToByteArray(registrar,pathWithoutUri);
} else if(path.startsWith(WeChatPluginImageSchema.SCHEMA_CONTENT)){
int byteCount; File file = getFileFromContentProvider(registrar,path);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (file != null) {
byteCount = bmp.getAllocationByteCount(); result = fileToByteArray(registrar,file.getAbsolutePath());
}else {
byteCount = bmp.getByteCount();
}
if (byteCount >= WX_MAX_IMAGE_BYTE_SIZE) {
result = Util.bmpToCompressedByteArray(bmp, Bitmap.CompressFormat.JPEG, true);
} else {
result = Util.bmpToByteArray(bmp, true);
} }
} else { }else {
// result = handleNetworkImage(registrar, path); // result = handleNetworkImage(registrar, path);
result = Util.inputStreamToByte(openStream(path)); result = Util.inputStreamToByte(openStream(path));
} }
...@@ -92,6 +88,26 @@ public class ShareImageUtil { ...@@ -92,6 +88,26 @@ public class ShareImageUtil {
return Util.bmpToByteArray(bmp, true); return Util.bmpToByteArray(bmp, true);
} }
private static byte[] fileToByteArray(PluginRegistry.Registrar registrar, String pathWithoutUri){
byte[] result = null;
Bitmap bmp = null;
bmp = BitmapFactory.decodeFile(pathWithoutUri);
int byteCount;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
byteCount = bmp.getAllocationByteCount();
}else {
byteCount = bmp.getByteCount();
}
if (byteCount >= WX_MAX_IMAGE_BYTE_SIZE) {
result = Util.bmpToCompressedByteArray(bmp, Bitmap.CompressFormat.JPEG, true);
} else {
result = Util.bmpToByteArray(bmp, true);
}
return result;
}
private static String getPackage(String assetsName) { private static String getPackage(String assetsName) {
String packageStr = null; String packageStr = null;
...@@ -164,4 +180,40 @@ public class ShareImageUtil { ...@@ -164,4 +180,40 @@ public class ShareImageUtil {
} }
} }
private static File getFileFromContentProvider(PluginRegistry.Registrar registrar,String path) {
Source source = null;
BufferedSink sink = null;
File file = null;
try {
Context context = registrar.context().getApplicationContext();
Uri uri = Uri.parse(path);
String suffix = null;
String mimeType = context.getContentResolver().getType(uri);
if (TextUtils.equals(mimeType, "image/jpeg") || TextUtils.equals(mimeType, "image/jpg")) {
suffix = ".jpg";
} else if (TextUtils.equals(mimeType, "image/png")) {
suffix = ".png";
}
file = File.createTempFile(UUID.randomUUID().toString(), suffix);
InputStream inputStream = context.getContentResolver().openInputStream(uri);
if (inputStream == null) {
return null;
}
OutputStream outputStream = new FileOutputStream(file);
sink = Okio.buffer(Okio.sink(outputStream));
source = Okio.source(inputStream);
sink.writeAll(source);
source.close();
sink.close();
} catch (IOException e) {
Log.i("fluwx","reading image failed:\n" + e.getMessage());
}
return file;
}
} }
...@@ -15,9 +15,13 @@ ...@@ -15,9 +15,13 @@
*/ */
package com.jarvan.fluwx.utils; package com.jarvan.fluwx.utils;
import android.content.Context;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.jarvan.fluwx.constant.WeChatPluginImageSchema; import com.jarvan.fluwx.constant.WeChatPluginImageSchema;
import com.jarvan.fluwx.constant.WechatPluginKeys; import com.jarvan.fluwx.constant.WechatPluginKeys;
...@@ -57,6 +61,8 @@ public class WeChatThumbnailUtil { ...@@ -57,6 +61,8 @@ public class WeChatThumbnailUtil {
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) { } else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length()); String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length());
file = new File(pathWithoutUri); file = new File(pathWithoutUri);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_CONTENT)) {
file = getFileFromContentProvider(registrar, thumbnail);
} else { } else {
file = downloadImage(thumbnail); file = downloadImage(thumbnail);
} }
...@@ -83,6 +89,8 @@ public class WeChatThumbnailUtil { ...@@ -83,6 +89,8 @@ public class WeChatThumbnailUtil {
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) { } else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length()); String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length());
file = new File(pathWithoutUri); file = new File(pathWithoutUri);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_CONTENT)) {
file = getFileFromContentProvider(registrar, thumbnail);
} else { } else {
file = downloadImage(thumbnail); file = downloadImage(thumbnail);
} }
...@@ -265,4 +273,40 @@ public class WeChatThumbnailUtil { ...@@ -265,4 +273,40 @@ public class WeChatThumbnailUtil {
} }
return suffix; return suffix;
} }
private static File getFileFromContentProvider(PluginRegistry.Registrar registrar, String path) {
Source source = null;
BufferedSink sink = null;
File file = null;
try {
Context context = registrar.context().getApplicationContext();
Uri uri = Uri.parse(path);
String suffix = null;
String mimeType = context.getContentResolver().getType(uri);
if (TextUtils.equals(mimeType, "image/jpeg") || TextUtils.equals(mimeType, "image/jpg")) {
suffix = ".jpg";
} else if (TextUtils.equals(mimeType, "image/png")) {
suffix = ".png";
}
file = File.createTempFile(UUID.randomUUID().toString(), suffix);
InputStream inputStream = context.getContentResolver().openInputStream(uri);
if (inputStream == null) {
return null;
}
OutputStream outputStream = new FileOutputStream(file);
sink = Okio.buffer(Okio.sink(outputStream));
source = Okio.source(inputStream);
sink.writeAll(source);
source.close();
sink.close();
} catch (IOException e) {
Log.i("fluwx", "reading image failed:\n" + e.getMessage());
}
return file;
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论