2013-07-27 5 views
1
public class Upload { 

ProgressDialog dialog = null; 
int serverResponseCode = 0; 
String uploadFilePath = null; 
String uploadFileName = null; 
String msg = null; 
String upLoadServerUri = " http://192.168.1.179/index.php"; 
protected MainActivity context; 

public Upload(MainActivity context) { 
    this.context = context; 
} 

public int uploadFile(String sourceFileUri) { 


    String fileName = sourceFileUri; 

    HttpURLConnection conn = null; 
    DataOutputStream dos = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1 * 1024 * 1024; 
    File sourceFile = new File(sourceFileUri); 

    if (!sourceFile.isFile()) { 

     context.dialog.dismiss(); 



     return 0; 

    } else { 
     try { 

      // open a URL connection to the Servlet 
      FileInputStream fileInputStream = new FileInputStream(sourceFile); 
      URL url = new URL(upLoadServerUri); 

      // Open a HTTP connection to the URL 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setDoInput(true); // Allow Inputs 
      conn.setDoOutput(true); // Allow Outputs 
      conn.setUseCaches(false); // Don't use a Cached Copy 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Connection", "Keep-Alive"); 
      conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
      conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
      conn.setRequestProperty("uploaded_file", fileName); 

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

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
        + fileName + "\"" + lineEnd); 

      dos.writeBytes(lineEnd); 

      // create a buffer of maximum size 
      bytesAvailable = fileInputStream.available(); 

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

      // read file and write it into form... 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      while (bytesRead > 0) { 

       dos.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      } 

      // send multipart form data necesssary after file data... 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      // Responses from the server (code and message) 
      serverResponseCode = conn.getResponseCode(); 
      String serverResponseMessage = conn.getResponseMessage(); 

      Log.i("uploadFile", "HTTP Response is : " 
        + serverResponseMessage + ": " + serverResponseCode); 

      if (serverResponseCode == 200) { 


       InputStream is = conn.getInputStream(); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
       String line; 
       StringBuffer response = new StringBuffer(); 
       while ((line = rd.readLine()) != null) { 
        response.append(line); 
        response.append('\r'); 
       } 
       rd.close(); 
       context.q_no.setText(response); 

       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 











       context.runOnUiThread(new Runnable() { 
        public void run() { 

         String msg = "yes"; 

         //context.messageText.setText(msg); 
         Toast.makeText(context, "File Upload Complete.", 
           Toast.LENGTH_SHORT).show(); 
        } 
       }); 

      } 
    } catch (MalformedURLException ex) { 

    Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
     } catch (Exception e) { 

      context.dialog.dismiss(); 
      e.printStackTrace(); 


      Log.e("Upload file to server Exception", "Exception : " 
        + e.getMessage(), e); 
     } 
     context.dialog.dismiss(); 
     return serverResponseCode; 

    } 
    } 
} 

Я попытался выполнить код для захвата изображения и загрузки на php server.it работает отлично. Когда я загружаю сервер изображений, возвращайте значение. Но когда я пытаюсь выполнить этот код, я получаю следующее исключение после загрузки изображения на сервер и ответ сервера.Загрузка изображения на сервер

07-27 10:50:55.303: W/System.err(4649):  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

ответ

2

Вы правильно используете upload в отдельной теме (AsyncTask?) - хорошо. Однако в любое время, когда вы взаимодействуете с пользовательским интерфейсом (.dialog.dismiss(), .setText(...) и т. Д.), Вам нужно запустить его в потоке пользовательского интерфейса.

2

Это потому, что вы пытаетесь обновить представление. может быть вызвано dialog.dissmiss(). потому что вы создали его в главной теме, я думаю. и вы отклоняете его из фоновой темы. фоновый поток не может обновлять представление. так что это может быть проблема.

+0

попробовать запустить его на MainUI нить. как вы уже сделали в своем коде для показа тостов. –

+0

, и если вы использовали AsyncTask, вы можете отменить диалог из метода выполнения onPost. –

0

Попробуйте этот код

public class MainActivity extends Activity { 

Button b,b1; 
TextView messageText; 
String upLoadServerUri = null; 
private static final int SELECT_PICTURE = 1; 
private String selectedImagePath; 
int serverResponseCode = 0; 
    ProgressDialog dialog = null; 
// String selectedPath = "/mnt/sdcard/"; 
// private ImageView img; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // img = (ImageView)findViewById(R.id.imageView1); 
    messageText=(TextView)findViewById(R.id.textView1); 
    b=(Button)findViewById(R.id.button1); 
    b1=(Button)findViewById(R.id.button2); 
    upLoadServerUri = "http://urlocation/picture_upload.php"; 
    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE); 
     } 
    }); 
    b1.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      dialog = ProgressDialog.show(MainActivity.this, "", "Uploading file...", true); 
      new Thread(new Runnable() { 
        public void run() { 
         runOnUiThread(new Runnable() { 
           public void run() { 
            messageText.setText("uploading started....."); 
           } 
          });      
         uploadFile(selectedImagePath); 
        } 
        }).start();   
      } 
     }); 
} 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_PICTURE) { 
       Uri selectedImageUri = data.getData(); 
       selectedImagePath = getPath(selectedImageUri); 
       System.out.println("Image Path : " + selectedImagePath); 
       // img.setImageURI(selectedImageUri); 
       //uploadFile(selectedImagePath); 
      } 
     } 
    } 
public int uploadFile(String sourceFileUri) { 
     String fileName = sourceFileUri; 
     HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 
      int bytesRead, bytesAvailable, bufferSize; 
      byte[] buffer; 
      int maxBufferSize = 1 * 1024 * 1024; 
      File sourceFile = new File(sourceFileUri); 
      if (!sourceFile.isFile()) { 
      dialog.dismiss(); 
      Log.e("uploadFile", "Source File not exist :"+selectedImagePath); 
      runOnUiThread(new Runnable() { 
        public void run() { 
         messageText.setText("Source File not exist :"+selectedImagePath); 
        } 
       }); 
      return 0; 
      } 
      else 
      { 
      try { 
      // open a URL connection to the Servlet 
        FileInputStream fileInputStream = new FileInputStream(sourceFile); 
        URL url = new URL(upLoadServerUri); 
      // Open a HTTP connection to the URL 
        conn = (HttpURLConnection) url.openConnection(); 
        conn.setDoInput(true); // Allow Inputs 
        conn.setDoOutput(true); // Allow Outputs 
        conn.setUseCaches(false); // Don't use a Cached Copy 
        conn.setRequestMethod("POST"); 
        conn.setRequestProperty("Connection", "Keep-Alive"); 
        conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
        conn.setRequestProperty("uploaded_file", fileName); 
       dos = new DataOutputStream(conn.getOutputStream()); 

       dos.writeBytes(twoHyphens + boundary + lineEnd); 
       dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
             + fileName + "\"" + lineEnd); 

       dos.writeBytes(lineEnd); 

       // create a buffer of maximum size 
       bytesAvailable = fileInputStream.available(); 

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

       // read file and write it into form... 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

       while (bytesRead > 0) { 

       dos.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

       } 

       // send multipart form data necesssary after file data... 
       dos.writeBytes(lineEnd); 
       dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

       // Responses from the server (code and message) 
       serverResponseCode = conn.getResponseCode(); 
       String serverResponseMessage = conn.getResponseMessage(); 

       Log.i("uploadFile", "HTTP Response is : " 
         + serverResponseMessage + ": " + serverResponseCode); 

       if(serverResponseCode == 200){ 

        runOnUiThread(new Runnable() { 
         public void run() { 

          String msg = "File Upload Completed.\n\n See uploaded file here : \n\n" 
              +"http://urlocation/picture_upload.php"; 

          messageText.setText(msg); 
          Toast.makeText(MainActivity.this, "File Upload Complete.", 
             Toast.LENGTH_SHORT).show(); 
         } 
        });     
       }  

       //close the streams // 
       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 

      } catch (MalformedURLException ex) { 

       dialog.dismiss(); 
       ex.printStackTrace(); 

       runOnUiThread(new Runnable() { 
        public void run() { 
         messageText.setText("MalformedURLException Exception : check script url."); 
         Toast.makeText(MainActivity.this, "MalformedURLException", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

       Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
      } catch (Exception e) { 

       dialog.dismiss(); 
       e.printStackTrace(); 

       runOnUiThread(new Runnable() { 
        public void run() { 
         messageText.setText("Got Exception : see logcat "); 
         Toast.makeText(MainActivity.this, "Got Exception : see logcat ", 
           Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       Log.e("Upload file to server Exception", "Exception : " 
               + e.getMessage(), e); 
      } 
      dialog.dismiss();  
      return serverResponseCode; 

     } // End else block 
    } 

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 
} 
Смежные вопросы