Search code examples
javaandroidpicasa

Posting a photo without metadata for Picasa Web Album (result 403 Forbidden)


Occured error(return 403 Forbidden) when upload a Photo without metadata to Picasa web album. (Memo: it'susing an OAuth2.0, "userId" is not gmail adress[numerical id]) i don't know occasion. anybody please technical support thanks

public String setdData(Context context, String filePath, String userId, String albumId, String accessToken) {

    // new ImageUploader(context, filePath, filePath).run();
    String url = "https://picasaweb.google.com/data/feed/api/user/" + userId + "/albumid/"
        + albumId;
    HttpClient httpClient = new DefaultHttpClient();
    File file = new File(filePath);
    HttpPost httpPost = new HttpPost(url);
    httpPost.setHeader("GData-Version", "2");
    // httpPost.addHeader("MIME-version", "1.0");
    httpPost.setHeader("Content-type", "image/jpeg");
    httpPost.setHeader("Slug", "plz-to-love-realcat.jpg");
    // httpPost.addHeader("Content-Length", String.valueOf(file.length()));
    httpPost.setHeader("Authorization", "GoogleLogin auth=" + accessToken);
    // httpPost.setHeader("Authorization", "OAuth " + accessToken);

    InputStreamEntity reqEntity;
    org.apache.http.HttpResponse response;

    try {
        reqEntity = new InputStreamEntity(new FileInputStream(file), file.length());

        String CONTENTTYPE_BINARY = "binary/octet-stream";
        reqEntity.setContentType(CONTENTTYPE_BINARY);
        reqEntity.setChunked(true);
        httpPost.setEntity(reqEntity);
        response = httpClient.execute(httpPost);

        Log.d("Picasa Upload", "STATUS CODE : " + response.getStatusLine().getStatusCode());

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Solution

  • I'm assuming that your accessToken is not null...

    This is my code and it works for me:

    public boolean setdData(Context context, String filePath, String userId, String albumId, String accessToken) {
        boolean success = false;
        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
    
        if (bitmap != null) {
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 87, baos);
                byte[] data = baos.toByteArray();
    
                ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
                HttpRequestFactory requestFactory = new NetHttpTransport().createRequestFactory();
                InputStreamContent content = new InputStreamContent("image/jpeg", inputStream);
    
                HttpRequest request = requestFactory.buildPostRequest(new genericUrl("https://picasaweb.google.com/data/feed/api/user/"+userId+"/"+albumId+"/default"), content);
                GoogleHeaders headers = new GoogleHeaders();
                String fileName = "Whatever...";
                headers.setSlugFromFileName(fileName);
                headers.setAuthorization("OAuth " + accessToken);
                request.setHeaders(headers);
                request.execute().ignore();
                // Success!
                success = true
            } catch (IOException e) {
            }
        }
        return success;
    }
    


    To make this code work, you will need to include some libraries.
    I used these:

    google-http-client-1.10.2-beta.jar
    google-api-client-1.10.2-beta.jar
    google-oauth-client-1.10.0-beta.jar
    jsr305-1.3.9.jar
    guava-11.0.1.jar

    You can find them here:
    http://code.google.com/p/google-api-java-client/downloads/detail?name=google-api-java-client-1.10.2-beta.zip