簡體   English   中英

wifi p2p文件傳輸android連接的設備但不傳輸

[英]wifi p2p file transfer android connected device but not transfering

你好,我從昨天起就陷入了問題,我在任何我創建的應用程序的任何地方搜索了所有顯示連接到同一路由器 wifi 的設備,然后我能夠使用這個例子來連接兩個設備https://developer.android.com/guide/topics/connectivity/ wifip2p.html#creating-app一切正常,兩個設備都已連接,但是當傳輸文件 serviceintent 未啟動時,這就是為什么我無法傳輸任何內容,沒有日志錯誤,但是當我選擇要發送的圖像時什么也沒發生

主活動類

package com.b.wifip2p;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WpsInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pGroup;
import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class MainActivity extends AppCompatActivity implements WifiP2pManager.PeerListListener, WifiP2pManager.ConnectionInfoListener {
    Button button;
    private boolean isWifiP2pEnabled = false;
    private boolean retryChannel = false;
    private final IntentFilter intentFilter = new IntentFilter();
    private WifiP2pManager.Channel channel;
    WifiP2pManager.Channel mChannel = null;
    WifiP2pManager mManager;
    private WifiP2pInfo info;
    BroadCast broadCast;
    private BroadcastReceiver receiver = null;
    static List peers = new ArrayList();
    ListView lv;
    static Adapater myadapter;
    ArrayList<DeviceInfo_Bean>list=new ArrayList<>();
    private WifiP2pDevice device;
    String hostaddd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=findViewById(R.id.lv);
        myadapter=new Adapater(this,list);
        button=findViewById(R.id.button);
        lv.setAdapter(myadapter);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
        mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        mChannel = mManager.initialize(this, getMainLooper(), null);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                connect();
            }
        });
        mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {
                System.out.println("---sucess discover");
            }

            @Override
            public void onFailure(int reasonCode) {
                System.out.println("---fail");
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(intent, 007);
                WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                int ipAddress = wifiInfo.getIpAddress();
                System.out.println("---ip"+ipAddress);


            }
        });




    }

    @Override
    public void onResume() {
        super.onResume();
        broadCast = new BroadCast(mManager,  mChannel, MainActivity.this);
        registerReceiver(broadCast, intentFilter);
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(broadCast);


    }
    private static WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() {
        @Override
        public void

        onPeersAvailable(WifiP2pDeviceList peerList) {

            List<WifiP2pDevice> refreshedPeers = (List<WifiP2pDevice>) peerList.getDeviceList();
            if (!refreshedPeers.equals(peers)) {
                peers.clear();
                peers.addAll(refreshedPeers);
                System.out.println("---ref"+refreshedPeers);


            }

            if (peers.size() == 0) {
                Log.d("-----deviceno", "No devices found");
                return;
            }

        }


    };




    @Override
    public void onPeersAvailable(WifiP2pDeviceList peers) {
        for (WifiP2pDevice device : peers.getDeviceList())
        {
            list.clear();
           String address=device.deviceAddress;
           String  name=device.deviceName;
           System.out.println("---name"+name+address);
            list.add(new DeviceInfo_Bean(name,address));

       }
        myadapter.notifyDataSetChanged();
        Log.i("----", "Found some peers!!! " + peers.getDeviceList());
    }


    public void connect() {

        DeviceInfo_Bean device = list.get(0);

        WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = device.address;
        config.wps.setup = WpsInfo.PBC;
        System.out.println("device in"+device.address);
        mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {
                Toast.makeText(MainActivity.this, "Connected.",
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int reason) {
                Toast.makeText(MainActivity.this, "Connect failed. Retry.",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }


    @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(MainActivity.this, 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);
        startService(serviceIntent);
    }



    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }

    public static class FileServerAsyncTask extends AsyncTask<Void, Void, String> {

        private Context context;
        //private TextView statusText;

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

        @Override
        protected String doInBackground(Void... params) {
            try {
                ServerSocket serverSocket = new ServerSocket(8988);
                System.out.println("---socket");
                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());
                OutputStream stream = client.getOutputStream();
                String s="---mymsg";
                stream.write(s.getBytes());
                Log.e("hello","context value "+context);

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

    public void onConnectionInfoAvailable(final WifiP2pInfo info) {
        System.out.println("---info");
            this.info=info;
       // view.setText("Group Owner IP - " + info.groupOwnerAddress.getHostAddress());


        InetAddress groupOwnerAddress = info.groupOwnerAddress;
        System.out.println("--g"+groupOwnerAddress);
        System.out.println("--info"+info.groupOwnerAddress.getHostAddress());
        if (info.groupFormed && info.isGroupOwner) {
            new FileServerAsyncTask(getApplication())
                    .execute();
        } else if (info.groupFormed) {
            // The other device acts as the client. In this case, we enable the
            // get file button.

        }

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

    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());
        System.out.println("---device"+device.deviceAddress);
    }

}'

廣播

package com.b.wifip2p;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.util.Log;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;

import java.nio.channels.Channel;

/**
 * Created by BHM on 3/3/2018.
 */

public class BroadCast extends BroadcastReceiver {
    private WifiP2pManager mManager;
    private WifiP2pManager.Channel mChannel;
    private MainActivity activity;
    PeerListListener peerListListener=null;

    public BroadCast(WifiP2pManager manager, WifiP2pManager.Channel channel,
                                 MainActivity activity) {
        super();
        this.mManager = manager;
        this.mChannel = channel;
        this.activity = (MainActivity) activity;
    }



    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("-----broadcast");
        String action = intent.getAction();
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {

            // UI update to indicate wifi p2p status.
            int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
            if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                // Wifi Direct mode is enabled
             //   activity.setIsWifiP2pEnabled(true);
            } else {
                //activity.setIsWifiP2pEnabled(false);
               // activity.resetData();

            }
           // Log.d(WiFiDirectActivity.TAG, "P2P state changed - " + state);
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {

            // request available peers from the wifi p2p manager. This is an
            // asynchronous call and the calling activity is notified with a
            // callback on PeerListListener.onPeersAvailable()
            if (mManager != null) {
//                mManager.requestPeers(mChannel, (PeerListListener) mChannel);
            }
      //      Log.d(WiFiDirectActivity.TAG, "P2P peers changed");
        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {

            if (mManager == null) {
                return;
            }

            NetworkInfo networkInfo = (NetworkInfo) intent
                    .getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);

            if (networkInfo.isConnected()) {

                // we are connected with the other device, request connection
                // info to find group owner IP


                mManager.requestConnectionInfo(mChannel, activity);
            } else {
                // It's a disconnect
               // activity.resetData();
            }
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
//            DeviceListFragment fragment = (DeviceListFragment) activity.getFragmentManager()
//                    .findFragmentById(R.id.frag_list);
//            fragment.updateThisDevice((WifiP2pDevice) intent.getParcelableExtra(
//                    WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
            intent.getParcelableExtra(
                  WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
        }
    }
    }

FileTransferService 這里的意圖不來了

package com.b.wifip2p;

import android.app.IntentService;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * Created by BHM on 3/4/2018.
 */

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



    @Override
    protected void onHandleIntent(Intent intent) {
        System.out.println("--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());
                }
                    MainActivity.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();
                        }
                    }
                }
            }

        }
    }
}

我知道這是一個有點老的問題,但對於那些尋找答案的人:

我建議檢查您的 AndroidManifest.xml 文件中是否有正確的意圖過濾器。 它應該看起來像:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_SEND_FILE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM