2013-02-05 70 views
2

我正在Android SDK上創建一個簡單的應用程序。我創建了一個Android客戶端和Java服務器。現在我創建的是Android應用程序瀏覽圖庫中的圖像並在屏幕上顯示路徑。此外,它顯示了顯示的圖像。首先開始發送連接的事情,我運行Java服務器。然後我在手機上運行應用程序。我選擇照片然後按發送。應用程序在推動並迫使關閉後發出fe fe聲。在下面你可以看到我的代碼。有任何想法嗎?Android的TCP發送文件。 Android Client將圖像發送到Java Server。不能發送圖像。該怎麼辦?

Android客戶端

package com.example.workingclient; 

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class SendfileActivity extends Activity { 
    /** Called when the activity is first created. */ 

    private static final int SELECT_PICTURE = 1; 

    private String selectedImagePath; 
    private ImageView img; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     System.out.println("34"); 
     img = (ImageView) findViewById(R.id.ivPic); 
     System.out.println("36"); 
     ((Button) findViewById(R.id.bBrowse)) 
       .setOnClickListener(new OnClickListener() { 
        public void onClick(View arg0) { 
         System.out.println("40"); 
         Intent intent = new Intent(); 
         intent.setType("image/*"); 
         intent.setAction(Intent.ACTION_GET_CONTENT); 
         startActivityForResult(
           Intent.createChooser(intent, "Select Picture"), 
           SELECT_PICTURE); 
         System.out.println("47"); 
        } 
       }); 
     ; 
     System.out.println("51"); 
     Button send = (Button) findViewById(R.id.bSend); 
     final TextView status = (TextView) findViewById(R.id.tvStatus); 

     send.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       Socket sock; 
       try { 
        sock = new Socket("192.168.0.3", 27015); 
        System.out.println("Connecting..."); 

        // sendfile 
          File myFile = new File (selectedImagePath); 
          byte [] mybytearray = new byte [(int)myFile.length()]; 
          FileInputStream fis = new FileInputStream(myFile); 
          BufferedInputStream bis = new BufferedInputStream(fis); 
          bis.read(mybytearray,0,mybytearray.length); 
          OutputStream os = sock.getOutputStream(); 
          System.out.println("Sending..."); 
          os.write(mybytearray,0,mybytearray.length); 
          os.flush(); 

         sock.close(); 
       } catch (UnknownHostException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



      } 
     }); 
    } 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_PICTURE) { 
       Uri selectedImageUri = data.getData(); 
       selectedImagePath = getPath(selectedImageUri); 
       TextView path = (TextView) findViewById(R.id.tvPath); 
       path.setText("Image Path : " + selectedImagePath); 
       img.setImageURI(selectedImageUri); 
      } 
     } 
    } 

    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); 
    } 
} 

的Android main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvStatus" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="hello" /> 

    <TextView 
     android:id="@+id/tvPath" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Path: " /> 

    <Button 
     android:id="@+id/bBrowse" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Browse" > 
    </Button> 

    <Button 
     android:id="@+id/bSend" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Send" /> 

    <ImageView 
     android:id="@+id/ivPic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 
    </ImageView> 

</LinearLayout> 

的Android的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.workingclient" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="16" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.workingclient.SendfileActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Java服務器

import java.io.*; 
import java.net.*; 

public class FileServer { 

    public static void main(String[] args) throws IOException { 
     int filesize = 6022386; // filesize temporary hardcoded 

     long start = System.currentTimeMillis(); 
     int bytesRead; 
     int current = 0; 

     // create socket 
     ServerSocket servsock = new ServerSocket(27015); 
     while (true) { 
      System.out.println("Waiting..."); 

      Socket sock = servsock.accept(); 
      System.out.println("Accepted connection : " + sock); 

      // receive file 
      byte[] mybytearray = new byte[filesize]; 
      InputStream is = sock.getInputStream(); 
      FileOutputStream fos = new FileOutputStream(
        "C:\\Users\\5750G\\Desktop\\Test.jpg"); // destination 
                    // path and 
                    // name of 
                    // file 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(mybytearray, 0, mybytearray.length); 
      current = bytesRead; 

      // thanks to A. Cádiz for the bug fix 
      do { 
       bytesRead = is.read(mybytearray, current, 
         (mybytearray.length - current)); 
       if (bytesRead >= 0) 
        current += bytesRead; 
      } while (bytesRead > -1); 

      bos.write(mybytearray, 0, current); 
      bos.flush(); 
      long end = System.currentTimeMillis(); 
      System.out.println(end - start); 
      bos.close(); 

      sock.close(); 
     } 
    } 

} 

錯誤

02-05 17:26:21.871: I/Start Server Button Clicked(22924): yipee 
02-05 17:26:21.871: D/AndroidRuntime(22924): Shutting down VM 
02-05 17:26:21.871: W/dalvikvm(22924): threadid=1: thread exiting with uncaught exception (group=0x40c5e1f8) 
02-05 17:26:21.876: E/AndroidRuntime(22924): FATAL EXCEPTION: main 
02-05 17:26:21.876: E/AndroidRuntime(22924): android.os.NetworkOnMainThreadException 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at libcore.io.IoBridge.connect(IoBridge.java:112) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.Socket.startupSocket(Socket.java:566) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.Socket.tryAllAddresses(Socket.java:127) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.Socket.<init>(Socket.java:177) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.net.Socket.<init>(Socket.java:149) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at com.example.workingclient.SendfileActivity$2.onClick(SendfileActivity.java:93) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.view.View.performClick(View.java:3627) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.view.View$PerformClick.run(View.java:14329) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.os.Handler.handleCallback(Handler.java:605) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.os.Looper.loop(Looper.java:137) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at android.app.ActivityThread.main(ActivityThread.java:4511) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.lang.reflect.Method.invokeNative(Native Method) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at java.lang.reflect.Method.invoke(Method.java:511) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
02-05 17:26:21.876: E/AndroidRuntime(22924): at dalvik.system.NativeStart.main(Native Method) 
02-05 17:26:47.916: I/Process(22924): Sending signal. PID: 22924 SIG: 9 
02-05 17:36:15.351: I/System.out(23357): 34 
02-05 17:36:15.351: I/System.out(23357): 36 
02-05 17:36:15.351: I/System.out(23357): 51 
02-05 17:36:15.416: D/CLIPBOARD(23357): Hide Clipboard dialog at Starting input: finished by someone else... ! 
+0

問題出在這裏:at com.example.workingclient.SendfileActivity $ 2.onClick(SendfileActivity.java:93) 看93行 – StarsSky

+0

if(resultCode == RESULT_OK){是93行。我應該在那裏做什麼? – ssmrkj

+0

請幫我一個人 – ssmrkj

回答

2

你有NetworkOnMainThreadException。解決方案是將上傳代碼放入其自己的線程或AsyncTask中。

+0

確實。這已經在這裏被覆蓋了很多次,如果有人想挖掘一個例子,這個問題可以作爲一個重複來關閉。 –

+0

有人可以給我的例子,我看着谷歌,但沒有好的教程... – ssmrkj

+1

有很多例子在stackoverflow。只是谷歌。 – greenapps