1

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

有了这种图像,我得到了一个互联网路径,如:

https://fbcdn-sphotos-ga.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 发送这些图像?

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

我真的很感谢你的帮助

4

1 回答 1

0

从选择器对话框中,您总是可以获得位图

选择器-->$Result->getData() = imageUri

从 imageUri 中,通过运行以下代码获取 Bitmap:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);

一旦你得到位图..,

你可以把它放到一个 fileSink

您可以使用 Hashmap 将其缓存在内存中

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 加载到实体来直接 http POST Bitmap ...

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 方法的背景在这里

lazyloader 项目是一个很好的模板。

那么,当您可以直接对位图中的字节进行操作时,为什么还要对文件使用 mimeMultipartEntity 呢?一旦你有了一个 Uri,就得到一个 Bitmap 并使用 bitmap/Uri 对作为你的 memCache 接口、HTTP POST 接口、fileSink 接口的基础,用于在你有 CacheMiss 时检索本地文件。这将有助于最大限度地减少基于文件的所有操作。

考虑使用 Map [hashON(Uri.toString() :: bitMap] 来存储您在本地处理的图像。然后当您想要发布图像时,您可以从地图中检索它并直接在“字节数组实体”。

于 2013-08-15T22:52:37.390 回答