如何正确地将同步外部应用程序映像发送到RESTful WCF

时间:2013-08-07 21:55:46

标签: android

我是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;
        }

通过这种图像,我得到了一条互联网路径:

https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-ash4/s2048x2048/432098_10151223392360790_398885469_n.jpg

为了清楚和评论。我得到了一个“内容”方案..所以我从“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发送这些图像?

或者将此图像发送到服务器的另一种正确方法?

我真的很感谢你的帮助

1 个答案:

答案 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 POST
case 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”中。