Отправить данные изображения в приложение Android из App Engine

В моем бэкэнде App Engine у ​​меня есть метод, который получает изображение из Google Cloud Storage

 @ApiMethod( name = "getProfileImage", path = "image", httpMethod = ApiMethod.HttpMethod.GET) public Image getProfileImage(@Named("imageName")String imageName){ try{ HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); GoogleCredential credential = GoogleCredential.getApplicationDefault(); Storage.Builder storageBuilder = new Storage.Builder(httpTransport,new JacksonFactory(),credential); Storage storage = storageBuilder.build(); Storage.Objects.Get getObject = storage.objects().get("mybucket", imageName); ByteArrayOutputStream out = new ByteArrayOutputStream(); // If you're not in AppEngine, download the whole thing in one request, if possible. getObject.getMediaHttpDownloader().setDirectDownloadEnabled(false); getObject.executeMediaAndDownloadTo(out); byte[] oldImageData = out.toByteArray(); out.close(); ImagesService imagesService = ImagesServiceFactory.getImagesService(); return ImagesServiceFactory.makeImage(oldImageData); }catch(Exception e){ logger.info("Error getting image named "+imageName); } return null; } 

Проблема, с которой я сталкиваюсь, – как мне получить данные изображения, когда я называю это в своем приложении для Android?

Поскольку вы не можете возвращать примитивы из ядра приложения, я преобразовал его в Image чтобы я мог вызвать getImageData() в моем приложении, чтобы получить байт [].

Однако объект Image, возвращенный в приложение, не совпадает с тем, который находится в приложении, поэтому нет getImageData ().

Как я могу получить данные изображения в приложение для Android?

Если я создаю объект с переменной байта [] в нем, то я устанавливаю переменную byte [] строковыми данными и возвращаю, что этот объект из этого метода будет работать?

Обновить

Изображение отправляется из приложения Android. (Этот код может быть или не быть правильным, я еще не отладил его)

 @WorkerThread public String startResumableSession(){ try{ File file = new File(mFilePath); long fileSize = file.length(); file = null; String sUrl = "https://www.googleapis.com/upload/storage/v1/b/lsimages/o?uploadType=resumable&name="+mImgName; URL url = new URL(sUrl); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestProperty("Authorization",""); urlConnection.setRequestProperty("X-Upload-Content-Type","image/png"); urlConnection.setRequestProperty("X-Upload-Content-Length",String.valueOf(fileSize)); urlConnection.setRequestMethod("POST"); if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK){ return urlConnection.getHeaderField("Location"); } }catch(Exception e){ e.printStackTrace(); } return null; } private long sendNextChunk(String sUrl,File file,long skip){ int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 524287; long totalBytesSent = 0; try{ long fileSize = file.length(); FileInputStream fileInputStream = new FileInputStream(file); skip = fileInputStream.skip(skip); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); totalBytesSent = skip + bufferSize; buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); try { while (bytesRead > 0) { try { URL url = new URL(sUrl); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setDoInput(true); urlConnection.setDoOutput(true); urlConnection.setUseCaches(false); urlConnection.setChunkedStreamingMode(524287); urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setRequestProperty("Content-Type","image/png"); urlConnection.setRequestProperty("Content-Length",String.valueOf(bytesRead)); urlConnection.setRequestProperty("Content-Range", "bytes "+String.valueOf(skip)+"-"+String.valueOf(totalBytesSent)+"/"+String.valueOf(fileSize)); DataOutputStream outputStream = new DataOutputStream(urlConnection.getOutputStream()); outputStream.write(buffer, 0, bufferSize); int code = urlConnection.getResponseCode(); if(code == 308){ String range = urlConnection.getHeaderField("Range"); return Integer.parseInt(range.split("-")[1]); }else if(code == HttpURLConnection.HTTP_CREATED){ return -1; } outputStream.flush(); outputStream.close(); outputStream = null; } catch (OutOfMemoryError e) { e.printStackTrace(); // response = "outofmemoryerror"; // return response; return -1; } fileInputStream.close(); } } catch (Exception e) { e.printStackTrace(); // response = "error"; // return response; return -1; } }catch(Exception e){ e.printStackTrace(); } return -1; } 

Изменить 2:

По-видимому, это не понятно людям, что я использую Endpoints в своем приложении для Android

Solutions Collecting From Web of "Отправить данные изображения в приложение Android из App Engine"

Что я закончил делать / выясняя, что вам нужно вызвать execute() для вызова api с конечными точками и вернуть реальные данные, переданные из API

пример

Вызов api возвращает Image

 public Image getProfileImage(@Named("id") long id, @Named("imageName")String imageName){ try{ ProfileRecord pr = get(id); HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); GoogleCredential credential = GoogleCredential.getApplicationDefault(); Storage.Builder storageBuilder = new Storage.Builder(httpTransport,new JacksonFactory(),credential); Storage storage = storageBuilder.build(); Storage.Objects.Get getObject = storage.objects().get("mybucket", imageName); ByteArrayOutputStream out = new ByteArrayOutputStream(); // If you're not in AppEngine, download the whole thing in one request, if possible. getObject.getMediaHttpDownloader().setDirectDownloadEnabled(false); getObject.executeMediaAndDownloadTo(out); byte[] oldImageData = out.toByteArray(); out.close(); return ImagesServiceFactory.makeImage(oldImageData); }catch(Exception e){ logger.info("Error getting image named "+imageName); } return null; } 

То на стороне клиента я бы назвал это так, чтобы получить его

 Image i = pr.profileImage(id,"name.jpg").execute(); byte[] data = i.decodeImageData(); 

Вы можете использовать Google Cloud Endpoints для этого:

Облачные конечные точки Google состоят из инструментов, библиотек и возможностей, которые позволяют создавать API-интерфейсы и клиентские библиотеки из приложения App Engine, называемого бэкэндом API, для упрощения доступа клиентов к данным из других приложений. Конечные точки упрощают создание веб-бэкэнда для веб-клиентов и мобильных клиентов, таких как Android или iOS от Apple.

См. https://cloud.google.com/appengine/docs/java/endpoints/