我是Android的新手,我正在尝试将一些图像从Android发送到RESTFul WCF。
到现在为止,我可以从图库中选择图像并将它们发送到服务器。
WCF期待图像为Stream
但是我遇到的Synced Images存在问题,这些图像存储在平板电脑中,就像Facebook或G +照片一样。 (我不知道他们是否被缓存或其他什么)
我正在使用此函数来获取图像的路径
public static String getRealPathFromURI(Context context, Uri contentUri) {
String path = null;
if (contentUri.getScheme().toString().compareTo("content")==0)
{
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
path = cursor.getString(column_index);
}
else
{
path = contentUri.getPath();
}
Log.i(TAG, path);
return path;
}
通过这种图像,我得到了一条互联网路径:
为了清楚和评论。我得到了一个“内容”方案..所以我从“if”这样的路径得到了:
content://com.sec.android.gallery3d.provider/picasa/item/5703464571893262194
使用MultipartEntity将它发送到服务器,因为我在其他人看到这里发布了这样做,就像这样:
((MultipartEntity) oInputEntity).addPart(
"fileContents",
new FileBody(new File(Utilities.getRealPathFromURI(context,
imageUri)),
"image/jpeg"));
使用这种图像我得到了FileNotFoundEception
我认为这是因为图像路径是Internet路径,因此MultiPartEntity不知道如何检索它,
所以我改变了下载图像的方法,现在正在处理这段代码
public static File getFileFromURI(Context context, Uri contentUri) {
String path = IntUtilities.getRealPathFromURI(context, contentUri);
Log.i(TAG, path);
final File file;
if (path.startsWith("http") || path.startsWith("/http") )
{
//if its an image form internet lets download it and save it in our directory and return that file
// Determine Uri of camera image to save.
final String fname = "BIR" + UUID.randomUUID() + ".jpg";
final File root = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "BIR");
root.mkdirs();
file = new File(root, fname);
try {
final URL url = new URL(path);
final HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(false);
urlConnection.connect();
final FileOutputStream fileOutput = new FileOutputStream(file);
final InputStream inputStream = urlConnection.getInputStream();
@SuppressWarnings("unused")
int downloadedSize = 0;
byte[] buffer = new byte[1024];
int bufferLength = 0;
while ((bufferLength = inputStream.read(buffer)) > 0) {
fileOutput.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
}
// close the output stream when done
fileOutput.close();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
file = new File(path);
}
return file;
}
((MultipartEntity) oInputEntity).addPart(
"fileContents",
new FileBody(Utilities.getFileFromURI(context,
imageUri),
"image/jpeg"));
但我对这个解决方案感到不舒服,似乎是双重努力,我在平板电脑上关闭了我的Wifi和3g,也关闭了平板电脑,我仍然看到那些图像,所以我猜它们在第一次同步时,在本地复制或在平板电脑上缓存。当我连接到我的计算机(在Windows资源管理器中)时,我查找了它们,看看它们是否在那里,但我没有看到它们,也许我做错了或者不知道存储文件夹。
我不喜欢这个解决方案的主要原因是,如果你现在没有互联网,显然图像将无法下载,而我正在制作的应用程序应该可以离线工作,而且...图像在那里,不应该要求互联网猜测本地图像。
这么说,有没有办法找到同步的这张照片的真实/物理路径,有一个http或https方案,使用MultiPartEntity发送这些图像?
或者将此图像发送到服务器的另一种正确方法?
我真的很感谢你的帮助
答案 0 :(得分:0)
从选择器对话框中,您始终可以获得位图
选择器 - > $ Result-> getData()= imageUri
从imageUri,通过运行以下代码获取Bitmap:
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
获得位图后,
你可以把它放到fileSink
您可以使用Hashmap将其缓存在Memory
中mBitMap = BitmapFactory.decodeStream(
mCR.openInputStream(imageUri), null, options);
OutputStream os = new FileOutputStream(f);
mBitMap.compress(Bitmap.CompressFormat.JPG, minVal, os);
mload.memoryCache.putbig(file.toURI().toURL().toString(), mBitMap);
你可以通过将ByteArray加载到Entity ...
来直接对POST位图进行http POSTcase POST:
HttpPost httpPost = new HttpPost(url);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
float tmp = (float) 1024 * 1024 / bmp.getByteCount();
int minVal = (Math.round(tmp * 100) < 101) ? Math.round(tmp * 100): 100;
if (bmp.compress(Bitmap.CompressFormat.JPEG, minVal, stream)){
httpPost.setEntity(new ByteArrayEntity(stream.toByteArray()));
}else{ //TODO need to format actual message
handler.sendMessage(Message.obtain(handler,
HttpConnection.DID_ERROR, new Exception("ERR bitmap NG")));
}
POST方法的背景是here
lazyloader project是一个很好用的模板。
那么为什么当你可以直接对bitMap中的字节进行操作时,可以将mimeMultipartEntity与文件一起使用?只要你有一个Uri,得到一个Bitmap并使用位图/ Uri对作为你的memCache接口的基础,接口到HTTP POST,接口到fileSink用于在你有CacheMiss时检索本地文件。这将有助于最大限度地减少基于文件的所有操作。
考虑使用Map [hashON(Uri.toString():: bitMap]来存储您在本地处理的图像。然后当您想要POST一个图像时,您可以从地图中检索它并POST它的字节直接在“ByteArrayEntity”中。