java - WiFi 直接演示

标签 java android wifi-direct

我对 Java 的了解不多,而且是 Android 开发的新手,但我需要将它用于我目前正在从事的项目。
我已经更改了 android studio 提供的 WiFi Direct 演示代码以发送字符串... 我现在遇到的问题是我想删除要求用户选择图像的部分...并在 TextView 框中显示结果。

以下是“修改后的”WiFi Direct Demo 的代码

设备细节 fragment 类:

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


                }

感谢您的帮助。

最佳答案

在您的 FileServerAsync 类的函数 doInBackground 中,您正在接收响应并将其保存在您创建的名为“response”的 String 对象中。一旦 doInBackground 函数终止,AsyncTask 类将调用函数 onPostExecute。在此函数中,您应该将响应文本设置为 TextView。您可以为 TextView 创建一个全局变量,然后在此函数中只需添加:textView.setText(response+"");

关于去掉让用户选择图片的选项,应该去掉这个函数中的内容:mContentView.findViewById(R.id.btn_start_client).setOnClickListener(...

因为在此函数中,您创建了一个获取图像的 Intent。相反,您只需添加一个 EditText,用户可以在其中输入他想要传输的字符串。

希望这对您有所帮助,如有任何更新或问题,请告诉我。

关于java - WiFi 直接演示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684948/

相关文章:

Android:SearchView组件更改图标(无ActionBar)

android - 使用 PhoneGap 在所有设备上保持恒定的视口(viewport)大小

java - 如何在edittext上创建特定的输入类型?可接受输入罗马数字 M D C X V I

Android 检测附近的设备(Covid-19 应用程序)

android - 是否可以通过编程方式从 Android 中删除记住的 Wifi Direct 组?

cordova - 我们有任何可用于 PhoneGap 中 Wi-Fi Direct 的插件吗?

java - 需要创建用户在 swing 应用程序中输入的信息并将其写入文件

Javafx 内存泄漏

java - 如何与另一件 JComboBox 元素交换?

java - 通过命令行将系统属性传递给 Jetty runner