2015-02-23 89 views
1

我對Java和Android開發有了很多瞭解,但是我需要將它用於我目前正在開發的項目。
我已經改變了從android studio提供的WiFi Direct Demo代碼發送字符串... 我現在的問題是我想刪除用戶被要求選擇圖像的部分...並顯示結果在文本視圖框中。WiFi Direct Demo

以下是從 「修飾的」 WiFi直演示

設備詳細信息片段類的代碼:

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; 
    String response = ""; 

    /** 
    * @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));*/ 

      InputStream inputstream = client.getInputStream(); 
      ByteArrayOutputStream byteArrayOutputStream = 
        new ByteArrayOutputStream(1024); 
      byte[] buffer = new byte[1024]; 

      int bytesRead; 
      while ((bytesRead = inputstream.read(buffer)) != -1){ 
        byteArrayOutputStream.write(buffer, 0, bytesRead); 
        response += byteArrayOutputStream.toString("UTF-8"); 

        serverSocket.close(); 
       } 

      // return f.getAbsolutePath(); 
     } catch (IOException e) { 
      Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
      return null; 
     } 
     return response; 
    } 

    /* 
    * (non-Javadoc) 
    * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
    */ 
    @Override 
    protected void onPostExecute(String result) { 
     if (result != null) { 

      statusText.setText("File copied - " + response); 
      Intent intent = new Intent(); 
      intent.setAction(android.content.Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse("file://" + result), "image/*"); 


     } 

    } 

    /* 
    * (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; 
    try { 
     while ((len = inputStream.read(buf)) != -1) { 
      out.write(buf, 0, len); 

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

}

的部分,需要的變化是:

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


       } 

謝謝你的幫助。

+0

如果我的答案有幫助,請注意/接受它,以便其他人將從中受益。 – 2015-04-05 17:33:40

回答

1

在您的FileServerAsync類的函數doInBackground中,您正在接收響應並將其保存在您創建的稱爲「響應」的String對象中。一旦doInBackground函數終止,AsyncTask類將調用函數onPostExecute。在這個函數中,您應該將響應文本設置爲TextView。你可以爲TextView創建一個全局變量,然後在這個函數中添加:textView.setText(response +「」);

作爲去除選項,讓用戶選擇一個圖片,你應該刪除這個函數的內容:mContentView.findViewById(R.id.btn_start_client).setOnClickListener(...

因爲在這個函數,您創建一個意圖去獲得的圖像。相反,你只需在用戶輸入他想傳遞一個String一個EditText。

希望這會有所幫助,讓我知道的任何更新或問題。