2010-10-20 11 views
1

J'ai une application Android qui tente de télécharger des photos sur un serveur Web via l'interface API. La méthode fonctionne très bien tant que les tailles d'image ne sont pas trop grandes (échoue quelque part autour de 1280x800) Heres le code qui fonctionnera sera plus petites images mais échoue avec les plus grandes. Aucune suggestion?Comment puis-je corriger mon téléchargement de photos Android pour envoyer des flux de données plus importants

public void uploadPhoto(FileInputStream fileInputStream, String session_key) throws IOException, ClientProtocolException { 

    URL connectURL = new URL(API_ENDPOINT_URL + "session_key=" 
      + session_key + "&method=" + ApiMethods.UPLOAD_PHOTO); 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 

    HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection(); 

    // Allow Inputs 
    conn.setDoInput(true); 

    // Allow Outputs 
    conn.setDoOutput(true); 

    // Don't use a cached copy. 
    conn.setUseCaches(false); 

    // Use a post method. 
    conn.setRequestMethod("POST"); 

    conn.setRequestProperty("Connection", "Keep-Alive"); 

    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+ boundary); 

    DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 

    dos.writeBytes(twoHyphens + boundary + lineEnd); 
    // Log.d(TAG, " dos1: " + dos); 
    dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ "file.png" + "\"" + lineEnd); 
    // Log.d(TAG, " dos2: " + dos); 
    dos.writeBytes(lineEnd); 
    // Log.d(TAG, " dos3: " + dos); 

    // create a buffer of maximum size 

    int bytesAvailable = fileInputStream.available(); 
    int maxBufferSize = 1024; 
    int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    byte[] buffer = new byte[bufferSize]; 

    // read file and write it into form... 

    int bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    Log.d(TAG, " BytesREad:" + bytesRead); 
    while (bytesRead > 0) { 
     Log.d(TAG, " BytesREad in while:" + bytesRead); 
     dos.write(buffer, 0, bufferSize); 
     // Log.d(TAG, " dos3: " + dos); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     /* 
     * dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + 
     * twoHyphens + lineEnd); 
     */ 
    } 

    // send multipart form data necesssary after file data... 

    // dos.write(data); 
    dos.writeBytes(lineEnd); 
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
    // Log.d(TAG, " dos4 tostring: " + dos.toString()); 

    // close streams 
    // Log.e(Tag,"File is written"); 
    // fileInputStream.close(); 
    dos.flush(); 
    // Log.d(TAG, " dos5: " + dos.toString()); 
    InputStream is = conn.getInputStream(); 
    // retrieve the response from server 
    int ch; 

    StringBuffer b = new StringBuffer(); 
    while ((ch = is.read()) != -1) { 
     b.append((char) ch); 
     // Log.d(TAG, " b: " + b.toString()); 
    } 
    String s = b.toString(); 
    Log.i("Response", s); 
    // Log.d(TAG, " response:" + s); 
    dos.close(); 

} 

Les erreurs comprennent

10 à 20 avril: 16: 26,658: ERREUR/dalvikvm tas (20213): allocation externe 8957952 octets trop grand pour ce processus. 10-20 04: 16: 26.658: ERROR/dalvikvm (20213): mémoire insuffisante: taille de tas = 4551 Ko, alloué = 3039 Ko, taille de bitmap = 9496 Ko 10-20 04: 16: 26.658: erreur/(20213): VM ne nous laissera pas allouer 8957952 octets

+0

Je suis confronté aussi même prob avec l'un de mon code. – viv

Répondre

1

J'ai eu problème similaire avant, avéré ne pas être le téléchargement de l'image, mais parce que je voulais afficher une activité ..

+0

Cela a permis au programme de ne pas planter, mais ne finira toujours pas le téléchargement, donc je pense que je cours dans le même problème – Brian

1

tout en travaillant sur PhoneKlone, J'ai trouvé que le téléchargement de grandes photos causé des erreurs sur Android simplement en raison de la limite d'erreur de VM.

Solution: soit la compression utilisation pour réduire la taille du fichier ou d'essayer « blocage » de l'image (ajout recadrée sections de la vidéo en plusieurs étapes)