2015-03-07 2 views
2

У меня есть Wi-fi прямое демо. В этом случае мы можем передавать любые файлы изображений на другие устройства. Когда подключается другое устройство, и он показывает, чтобы отправить изображение из галереи. А с другой стороны он показывает отправленное изображение. Но я хочу отправить простую строку, а с другой стороны хочу поджарить эту строку. Здесь я отправляю код, в котором они реализовали передачу файлов. Я очень смущен в этом коде. Я не получаю, чтобы изменить, чтобы передать только строку. Пожалуйста, помогите мне. Благодарю.Android - Передача простой строки по Wi-fi?

DeviceDetailFragment.java

/** 
* A fragment that manages a particular peer and allows interaction with device 
* i.e. setting up network connection and transferring data. 
*/ 
public class DeviceDetailFragment extends Fragment implements ConnectionInfoListener { 

    protected static final int CHOOSE_FILE_RESULT_CODE = 20; 
    private View mContentView = null; 
    private WifiP2pDevice device; 
    private WifiP2pInfo info; 
    ProgressDialog progressDialog = null; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     mContentView = inflater.inflate(R.layout.device_detail, null); 
     mContentView.findViewById(R.id.btn_connect).setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       WifiP2pConfig config = new WifiP2pConfig(); 
       config.deviceAddress = device.deviceAddress; 
       config.wps.setup = WpsInfo.PBC; 
       if (progressDialog != null && progressDialog.isShowing()) { 
        progressDialog.dismiss(); 
       } 
       progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", 
         "Connecting to :" + device.deviceAddress, true, true 
//      new DialogInterface.OnCancelListener() { 
// 
//       @Override 
//       public void onCancel(DialogInterface dialog) { 
//        ((DeviceActionListener) getActivity()).cancelDisconnect(); 
//       } 
//      } 
         ); 
       ((DeviceActionListener) getActivity()).connect(config); 

      } 
     }); 

     mContentView.findViewById(R.id.btn_disconnect).setOnClickListener(
       new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         ((DeviceActionListener) getActivity()).disconnect(); 
        } 
       }); 

     mContentView.findViewById(R.id.btn_start_client).setOnClickListener(
       new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // Allow user to pick an image from Gallery or other 
         // registered apps 
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
         intent.setType("image/*"); 
         startActivityForResult(intent, CHOOSE_FILE_RESULT_CODE); 
        } 
       }); 

     return mContentView; 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     // User has picked an image. Transfer it to group owner i.e peer using 
     // FileTransferService. 
     Uri uri = data.getData(); 
     TextView statusText = (TextView) mContentView.findViewById(R.id.status_text); 
     statusText.setText("Sending: " + uri); 
     Log.d(WiFiDirectActivity.TAG, "Intent----------- " + uri); 
     Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
     serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
     serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString()); 
     serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 
       info.groupOwnerAddress.getHostAddress()); 
     serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 
     getActivity().startService(serviceIntent); 
    } 

    @Override 
    public void onConnectionInfoAvailable(final WifiP2pInfo info) { 
     if (progressDialog != null && progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
     } 
     this.info = info; 
     this.getView().setVisibility(View.VISIBLE); 

     // The owner IP is now known. 
     TextView view = (TextView) mContentView.findViewById(R.id.group_owner); 
     view.setText(getResources().getString(R.string.group_owner_text) 
       + ((info.isGroupOwner == true) ? getResources().getString(R.string.yes) 
         : getResources().getString(R.string.no))); 

     // InetAddress from WifiP2pInfo struct. 
     view = (TextView) mContentView.findViewById(R.id.device_info); 
     view.setText("Group Owner IP - " + info.groupOwnerAddress.getHostAddress()); 

     // After the group negotiation, we assign the group owner as the file 
     // server. The file server is single threaded, single connection server 
     // socket. 
     if (info.groupFormed && info.isGroupOwner) { 
      new FileServerAsyncTask(getActivity(), mContentView.findViewById(R.id.status_text)) 
        .execute(); 
     } else if (info.groupFormed) { 
      // The other device acts as the client. In this case, we enable the 
      // get file button. 
      mContentView.findViewById(R.id.btn_start_client).setVisibility(View.VISIBLE); 
      ((TextView) mContentView.findViewById(R.id.status_text)).setText(getResources() 
        .getString(R.string.client_text)); 
     } 

     // hide the connect button 
     mContentView.findViewById(R.id.btn_connect).setVisibility(View.GONE); 
    } 

    /** 
    * Updates the UI with device data 
    * 
    * @param device the device to be displayed 
    */ 
    public void showDetails(WifiP2pDevice device) { 
     this.device = device; 
     this.getView().setVisibility(View.VISIBLE); 
     TextView view = (TextView) mContentView.findViewById(R.id.device_address); 
     view.setText(device.deviceAddress); 
     view = (TextView) mContentView.findViewById(R.id.device_info); 
     view.setText(device.toString()); 

    } 

    /** 
    * Clears the UI fields after a disconnect or direct mode disable operation. 
    */ 
    public void resetViews() { 
     mContentView.findViewById(R.id.btn_connect).setVisibility(View.VISIBLE); 
     TextView view = (TextView) mContentView.findViewById(R.id.device_address); 
     view.setText(R.string.empty); 
     view = (TextView) mContentView.findViewById(R.id.device_info); 
     view.setText(R.string.empty); 
     view = (TextView) mContentView.findViewById(R.id.group_owner); 
     view.setText(R.string.empty); 
     view = (TextView) mContentView.findViewById(R.id.status_text); 
     view.setText(R.string.empty); 
     mContentView.findViewById(R.id.btn_start_client).setVisibility(View.GONE); 
     this.getView().setVisibility(View.GONE); 
    } 

    /** 
    * A simple server socket that accepts connection and writes some data on 
    * the stream. 
    */ 
    public static class FileServerAsyncTask extends AsyncTask<Void, Void, String> { 

     private Context context; 
     private TextView statusText; 

     /** 
     * @param context 
     * @param statusText 
     */ 
     public FileServerAsyncTask(Context context, View statusText) { 
      this.context = context; 
      this.statusText = (TextView) statusText; 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      try { 
       ServerSocket serverSocket = new ServerSocket(8988); 
       Log.d(WiFiDirectActivity.TAG, "Server: Socket opened"); 
       Socket client = serverSocket.accept(); 
       Log.d(WiFiDirectActivity.TAG, "Server: connection done"); 
       final File f = new File(Environment.getExternalStorageDirectory() + "/" 
         + context.getPackageName() + "/wifip2pshared-" + System.currentTimeMillis() 
         + ".jpg"); 

       File dirs = new File(f.getParent()); 
       if (!dirs.exists()) 
        dirs.mkdirs(); 
       f.createNewFile(); 

       Log.d(WiFiDirectActivity.TAG, "server: copying files " + f.toString()); 
       InputStream inputstream = client.getInputStream(); 
       copyFile(inputstream, new FileOutputStream(f)); 
       serverSocket.close(); 
       return f.getAbsolutePath(); 
      } catch (IOException e) { 
       Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
       return null; 
      } 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
     */ 
     @Override 
     protected void onPostExecute(String result) { 
      if (result != null) { 
       statusText.setText("File copied - " + result); 
       Intent intent = new Intent(); 
       intent.setAction(android.content.Intent.ACTION_VIEW); 
       intent.setDataAndType(Uri.parse("file://" + result), "image/*"); 
       context.startActivity(intent); 
      } 

     } 

     /* 
     * (non-Javadoc) 
     * @see android.os.AsyncTask#onPreExecute() 
     */ 
     @Override 
     protected void onPreExecute() { 
      statusText.setText("Opening a server socket"); 
     } 

    } 

    public static boolean copyFile(InputStream inputStream, OutputStream out) { 
     byte buf[] = new byte[1024]; 
     int len; 
     long startTime=System.currentTimeMillis(); 

     try { 
      while ((len = inputStream.read(buf)) != -1) { 
       out.write(buf, 0, len); 
      } 
      out.close(); 
      inputStream.close(); 
      long endTime=System.currentTimeMillis()-startTime; 
      Log.v("","Time taken to transfer all bytes is : "+endTime); 

     } catch (IOException e) { 
      Log.d(WiFiDirectActivity.TAG, e.toString()); 
      return false; 
     } 
     return true; 
    } 

} 

FileTransferService.java

/** 
* A service that process each file transfer request i.e Intent by opening a 
* socket connection with the WiFi Direct Group Owner and writing the file 
*/ 
public class FileTransferService extends IntentService { 

    private static final int SOCKET_TIMEOUT = 5000; 
    public static final String ACTION_SEND_FILE = "com.example.android.wifidirect.SEND_FILE"; 
    public static final String EXTRAS_FILE_PATH = "file_url"; 
    public static final String EXTRAS_GROUP_OWNER_ADDRESS = "go_host"; 
    public static final String EXTRAS_GROUP_OWNER_PORT = "go_port"; 

    public FileTransferService(String name) { 
     super(name); 
    } 

    public FileTransferService() { 
     super("FileTransferService"); 
    } 

    /* 
    * (non-Javadoc) 
    * @see android.app.IntentService#onHandleIntent(android.content.Intent) 
    */ 
    @Override 
    protected void onHandleIntent(Intent intent) { 

     Context context = getApplicationContext(); 
     if (intent.getAction().equals(ACTION_SEND_FILE)) { 
      String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH); 
      String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS); 
      Socket socket = new Socket(); 
      int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT); 

      try { 
       Log.d(WiFiDirectActivity.TAG, "Opening client socket - "); 
       socket.bind(null); 
       socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT); 

       Log.d(WiFiDirectActivity.TAG, "Client socket - " + socket.isConnected()); 
       OutputStream stream = socket.getOutputStream(); 
       ContentResolver cr = context.getContentResolver(); 
       InputStream is = null; 
       try { 
        is = cr.openInputStream(Uri.parse(fileUri)); 
       } catch (FileNotFoundException e) { 
        Log.d(WiFiDirectActivity.TAG, e.toString()); 
       } 
       DeviceDetailFragment.copyFile(is, stream); 
       Log.d(WiFiDirectActivity.TAG, "Client: Data written"); 
      } catch (IOException e) { 
       Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
      } finally { 
       if (socket != null) { 
        if (socket.isConnected()) { 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          // Give up 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 

     } 
    } 
} 
+0

Как создать сокет? –

ответ

1

Вы можете сделать что-то вроде этого:

DeviceDetailFragment.java

@Override 
    protected String doInBackground(Void... params) { 
     ServerSocket serverSocket = null; 
     Socket client = null; 
     DataInputStream inputstream = null; 
     try { 
      serverSocket = new ServerSocket(8988); 
      client = serverSocket.accept(); 
      inputstream = new DataInputStream(client.getInputStream()); 
      String str = inputstream.readUTF(); 
      serverSocket.close(); 
      return str; 
     } catch (IOException e) { 
      Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
      return null; 
     }finally{ 
      if(inputstream != null){ 
       try{ 
        inputstream.close(); 
       } catch (IOException e) { 
        Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
       } 
      } 
      if(client != null){ 
       try{ 
        client.close(); 
       } catch (IOException e) { 
        Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
       } 
      } 
      if(serverSocket != null){ 
       try{ 
        serverSocket.close(); 
       } catch (IOException e) { 
        Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
       } 
      } 
     } 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     if (result != null) { 
      Toast.makeText(..., result, ...).show();; 
     } 

    } 

FileTransferService.java

@Override 
protected void onHandleIntent(Intent intent) { 

    Context context = getApplicationContext(); 
    if (intent.getAction().equals(ACTION_SEND_FILE)) { 
     String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS); 
     Socket socket = new Socket(); 
     int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT); 
     DataOutputStream stream = null; 
     try { 
      socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT); 
      stream = new DataOutputStream(socket.getOutputStream()); 
      stream.writeUTF("a string"); 
     } catch (IOException e) { 
      Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
     } finally { 
      if (stream != null) { 
       try { 
        stream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }  
      } 
      if (socket != null) { 
       if (socket.isConnected()) { 
        try { 
         socket.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 

    } 
} 
+0

Спасибо, это работает. Но я хочу отправить строку, когда я нажимаю кнопку btn_start_client. Здесь, когда я нажимаю на эту кнопку, открывается галерея, и когда я выбираю изображение, тогда строка может быть отправлена. Как отправить эту строку при нажатии кнопки? –

+0

Это намерение намерения = новый намерение (Intent.ACTION_GET_CONTENT); intent.setType ("изображение/*"); startActivityForResult (намерение, CHOOSE_FILE_RESULT_CODE); 'это код, который открывает галерею (удалить ее и этого не произойдет), и этот' новый FileServerAsyncTask (getActivity(), mContentView.findViewById (R.id.status_text)). execute() ; '- это код, который начинает прослушивать соединения и получать' String', вы должны выполнить его в методе 'onClick (...)' кнопки 'btn_start_client'. – Titus

+0

отлично ... спасибо большое :) –

 Смежные вопросы

  • Нет связанных вопросов^_^