我是 Android 的新手,我正在尝试将一些图像从 Android 发送到 RESTFul WCF。
现在我可以从图库中选择图像并将它们发送到服务器。
WCF 期望图像为Stream
但是我遇到了存储在平板电脑中的同步图像问题,例如 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 发送这些图像?
或者另一种将此图像发送到服务器的正确方法?
我真的很感谢你的帮助