page.title=Wi-Fi Peer-to-Peer
page.tags=wireless,WifiP2pManager,Wi-Fi Direct,WiFi Direct,P2P,Wi-Fi P2P,WiFi P2P

@jd:body

  <div id="qv-wrapper">
    <div id="qv">
      <h2>In this document</h2>

      <ol>
        <li><a href="#api">API Overview</a></li>
        <li><a href="#creating-br">Creating a Broadcast Receiver for Wi-Fi P2P Intents</a></li>

        <li>
          <a href="#creating-app">Creating a Wi-Fi P2P Application</a>

          <ol>
            <li><a href="#setup">Initial setup</a></li>

            <li><a href="#discovering">Discovering peers</a></li>

            <li><a href="#connecting">Connecting to peers</a></li>

            <li><a href="#transferring">Transferring data</a></li>
          </ol>
        </li>
      </ol>
    <h2>See also</h2>
    <ul>
      <li><a href="{@docRoot}training/connect-devices-wirelessly/wifi-direct.html">Creating
        P2P Connections with Wi-Fi</a></li>
    </ul>
    </div>
  </div>


<p>Wi-Fi peer-to-peer (P2P) allows Android 4.0 (API level 14) or later devices with the appropriate
hardware to connect directly to each other via Wi-Fi without an intermediate access point (Android's
Wi-Fi P2P framework complies with the Wi-Fi Alliance's Wi-Fi Direct&trade; certification program).
Using these APIs, you can discover and connect to other devices when each device supports Wi-Fi P2P,
then communicate over a speedy connection across distances much longer than a Bluetooth connection.
This is useful for applications that share data among users, such as a multiplayer game or
a photo sharing application.</p>

  <p>The Wi-Fi P2P APIs consist of the following main parts:</p>

  <ul>
    <li>Methods that allow you to discover, request, and connect to peers are defined
    in the {@link android.net.wifi.p2p.WifiP2pManager} class.</li>

    <li>Listeners that allow you to be notified of the success or failure of {@link
    android.net.wifi.p2p.WifiP2pManager} method calls. When calling {@link
    android.net.wifi.p2p.WifiP2pManager} methods, each method can receive a specific listener
    passed in as a parameter.</li>

    <li>Intents that notify you of specific events detected by the Wi-Fi P2P framework,
    such as a dropped connection or a newly discovered peer.</li>
  </ul>

  <p>You often use these three main components of the APIs together. For example, you can
  provide a {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} to a call to {@link
  android.net.wifi.p2p.WifiP2pManager#discoverPeers discoverPeers()}, so that you can be
  notified with the {@link android.net.wifi.p2p.WifiP2pManager.ActionListener#onSuccess
  ActionListener.onSuccess()} and {@link android.net.wifi.p2p.WifiP2pManager.ActionListener#onFailure
  ActionListener.onFailure()}
  methods. A {@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION} intent is
  also broadcast if the {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers discoverPeers()}
  method discovers that the peers list has changed.</p>
  
  <h2 id="api">API Overview</h2>

<p>The {@link android.net.wifi.p2p.WifiP2pManager} class provides methods to allow you to interact with
  the Wi-Fi hardware on your device to do things like discover and connect to peers. The following actions
  are available:</p>

<p class="table-caption"><strong>Table 1.</strong>Wi-Fi P2P Methods</p>

   <table>
        <tr>
          <th>Method</th>
          <th>Description</th>
        </tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</td>
	  <td>Registers the application with the Wi-Fi framework. This must be called before calling any other Wi-Fi P2P method.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#connect connect()}</td>
	  <td>Starts a peer-to-peer connection with a device with the specified configuration.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#cancelConnect cancelConnect()}</td>
	  <td>Cancels any ongoing peer-to-peer group negotiation.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#requestConnectionInfo requestConnectInfo()}</td>
	  <td>Requests a device's connection information.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#createGroup createGroup()}</td>
	  <td>Creates a peer-to-peer group with the current device as the group owner.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#removeGroup removeGroup()}</td>
	  <td>Removes the current peer-to-peer group.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#requestGroupInfo requestGroupInfo()}</td>
	  <td>Requests peer-to-peer group information.</td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener#discoverPeers discoverPeers()}</td>
	  <td>Initiates peer discovery </td>
	</tr>

	<tr>
	  <td>{@link android.net.wifi.p2p.WifiP2pManager#requestPeers requestPeers()}</td>
	  <td>Requests the current list of discovered peers.</td>
	</tr>
  </table>


 <p>{@link android.net.wifi.p2p.WifiP2pManager} methods let you pass in a listener,
  so that the Wi-Fi P2P framework can notify your
  activity of the status of a call. The available listener interfaces and the
  corresponding {@link android.net.wifi.p2p.WifiP2pManager} method calls that use the listeners
  are described in the following table:</p>

 <p class="table-caption"><strong>Table 2.</strong> Wi-Fi P2P Listeners</p>
 
 <table>
    <tr>
      <th>Listener interface</th>
      <th>Associated actions</th>
    </tr>
    <tr>
    <td>{@link android.net.wifi.p2p.WifiP2pManager.ActionListener}</td>
    <td>{@link android.net.wifi.p2p.WifiP2pManager#connect connect()}, {@link
    android.net.wifi.p2p.WifiP2pManager#cancelConnect cancelConnect()}, {@link
    android.net.wifi.p2p.WifiP2pManager#createGroup createGroup()}, {@link
    android.net.wifi.p2p.WifiP2pManager#removeGroup removeGroup()}, and {@link
    android.net.wifi.p2p.WifiP2pManager.PeerListListener#discoverPeers discoverPeers()}</td>
    </tr>

    <tr>
      <td>{@link android.net.wifi.p2p.WifiP2pManager.ChannelListener}</td>
      <td>{@link android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</td>
    </tr>

    <tr>
      <td>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener}</td>
      <td>{@link android.net.wifi.p2p.WifiP2pManager#requestConnectionInfo requestConnectInfo()}</td>
    </tr>

    <tr>
      <td>{@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener}</td>
      <td>{@link android.net.wifi.p2p.WifiP2pManager#requestGroupInfo requestGroupInfo()}</td>
    </tr>

    <tr>
      <td>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener}</td>
      <td>{@link android.net.wifi.p2p.WifiP2pManager#requestPeers requestPeers()}</td>
    </tr>
  </table>

<p>The Wi-Fi P2P APIs define intents that are broadcast when certain Wi-Fi P2P events happen,
  such as when a new peer is discovered or when a device's Wi-Fi state changes. You can register
  to receive these intents in your application by <a href="#creating-br">creating a broadcast
  receiver</a> that handles these intents:</p>

<p class="table-caption"><strong>Table 3.</strong> Wi-Fi P2P Intents</p>

    <table>
    <tr>
      <th>Intent</th>
      <th>Description</th>
    </tr>
      <tr>
        <td>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_CONNECTION_CHANGED_ACTION}</td>
        <td>Broadcast when the state of the device's Wi-Fi connection changes.</td>
      </tr>
      <tr>
        <td>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION}</td>
        <td>Broadcast when you call {@link
    android.net.wifi.p2p.WifiP2pManager.PeerListListener#discoverPeers discoverPeers()}. You
    usually want to call {@link android.net.wifi.p2p.WifiP2pManager.PeerListListener#requestPeers
    requestPeers()} to get an updated list of peers if you handle this intent in your
    application.</td>
      </tr>
      <tr>
        <td>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_CHANGED_ACTION}</td>
        <td>Broadcast when Wi-Fi P2P is enabled or disabled on the device.</td>
      </tr>
      <tr>
        <td>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}</td>
        <td>Broadcast when a device's details have changed, such as the device's name.</td>
      </tr>
    </table>



  <h2 id="creating-br">Creating a Broadcast Receiver for Wi-Fi P2P Intents</h2>

  <p>A broadcast receiver allows you to receive intents broadcast by the Android system,
  so that your application can respond to events that you are interested in. The basic steps
  for creating a broadcast receiver to handle Wi-Fi P2P intents are as follows:</p>

  <ol>
    <li>Create a class that extends the {@link android.content.BroadcastReceiver} class. For the
    class' constructor, you most likely want to have parameters for the {@link
    android.net.wifi.p2p.WifiP2pManager}, {@link android.net.wifi.p2p.WifiP2pManager.Channel}, and
    the activity that this broadcast receiver will be registered in. This allows the broadcast
    receiver to send updates to the activity as well as have access to the Wi-Fi hardware and a
    communication channel if needed.</li>

    <li>In the broadcast receiver, check for the intents that you are interested in
    <code>{@link android.content.BroadcastReceiver#onReceive onReceive()}</code>.
    Carry out any necessary actions depending on the intent that is
    received. For example, if the broadcast receiver receives a {@link
    android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION} intent, you can call the
    {@link android.net.wifi.p2p.WifiP2pManager#requestPeers requestPeers()} method to get a list of
    the currently discovered peers.</li>
  </ol>

  <p>The following code shows you how to create a typical broadcast receiver. The broadcast
  receiver takes a {@link android.net.wifi.p2p.WifiP2pManager} object and an activity as
  arguments and uses these two classes to appropriately carry out the needed actions when the
  broadcast receiver receives an intent:</p>

<pre>
/**
 * A BroadcastReceiver that notifies of important Wi-Fi p2p events.
 */
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {

    private WifiP2pManager mManager;
    private Channel mChannel;
    private MyWiFiActivity mActivity;

    public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel,
            MyWifiActivity activity) {
        super();
        this.mManager = manager;
        this.mChannel = channel;
        this.mActivity = activity;
    }

    &#064;Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            // Check to see if Wi-Fi is enabled and notify appropriate activity
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            // Call WifiP2pManager.requestPeers() to get a list of current peers
        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            // Respond to new connection or disconnections
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            // Respond to this device's wifi state changing
        }
    }
}
</pre>

  <h2 id="creating-app">Creating a Wi-Fi P2P Application</h2>

  <p>Creating a Wi-Fi P2P application involves creating and registering a
  broadcast receiver for your application, discovering peers, connecting to a peer, and
  transferring data to a peer. The following sections describe how to do this.</p>

  <h3 id="setup">Initial setup</h3>
  <p>Before using the Wi-Fi P2P APIs, you must ensure that your application can access
  the hardware and that the device supports the Wi-Fi P2P protocol. If Wi-Fi P2P is supported,
  you can obtain an instance of {@link android.net.wifi.p2p.WifiP2pManager}, create and register
  your broadcast receiver, and begin using the Wi-Fi P2P APIs.</p>
  <ol>
    <li>
      <p>Request permission to use the Wi-Fi hardware on the device and also declare
      your application to have the correct minimum SDK version in the Android manifest:</p>
      <pre>
&lt;uses-sdk android:minSdkVersion="14" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt;
&lt;uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&gt;
&lt;uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /&gt;
&lt;uses-permission android:name="android.permission.INTERNET" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
</pre>
    </li>

    <li>Check to see if Wi-Fi P2P is on and supported. A good place to check this is in your
    broadcast receiver when it receives the {@link
    android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_CHANGED_ACTION} intent. Notify your
    activity of the Wi-Fi P2P state and react accordingly:
<pre>
&#064;Override
public void onReceive(Context context, Intent intent) {
    ...
    String action = intent.getAction();
    if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
        int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
        if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
            // Wifi P2P is enabled
        } else {
            // Wi-Fi P2P is not enabled
        }
    }
    ...
}
</pre>
    </li>

    <li>In your activity's {@link android.app.Activity#onCreate onCreate()} method, obtain an instance of {@link
    android.net.wifi.p2p.WifiP2pManager} and register your application with the Wi-Fi P2P
    framework by calling {@link android.net.wifi.p2p.WifiP2pManager#initialize initialize()}. This
    method returns a {@link android.net.wifi.p2p.WifiP2pManager.Channel}, which is used to connect
    your application to the Wi-Fi P2P framework. You should also create an instance of your
    broadcast receiver with the {@link
    android.net.wifi.p2p.WifiP2pManager} and {@link android.net.wifi.p2p.WifiP2pManager.Channel}
    objects along with a reference to your activity. This allows your broadcast receiver to notify
    your activity of interesting events and update it accordingly. It also lets you manipulate the device's
    Wi-Fi state if necessary:
<pre>
WifiP2pManager mManager;
Channel mChannel;
BroadcastReceiver mReceiver;
...
&#064;Override
protected void onCreate(Bundle savedInstanceState){
    ...
    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    mChannel = mManager.initialize(this, getMainLooper(), null);
    mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);
    ...
}
</pre>
    </li>

    <li>Create an intent filter and add the same intents that your
    broadcast receiver checks for:
      <pre>
IntentFilter mIntentFilter;
...
&#064;Override
protected void onCreate(Bundle savedInstanceState){
    ...
    mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
    ...
}
</pre>
    </li>

    <li>Register the broadcast receiver in the {@link android.app.Activity#onResume()} method
    of your activity and unregister it in the {@link android.app.Activity#onPause()} method of your activity:
      <pre>
/* register the broadcast receiver with the intent values to be matched */
&#064;Override
protected void onResume() {
    super.onResume();
    registerReceiver(mReceiver, mIntentFilter);
}
/* unregister the broadcast receiver */
&#064;Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mReceiver);
}
</pre>

      <p>When you have obtained a {@link android.net.wifi.p2p.WifiP2pManager.Channel} and
      set up a broadcast receiver, your application can make Wi-Fi P2P method calls and receive
      Wi-Fi P2P intents.</p>
    </li>

    <p>You can now implement your application and use the Wi-Fi P2P features by calling the
    methods in {@link android.net.wifi.p2p.WifiP2pManager}. The next sections describe how to do common actions
    such as discovering and connecting to peers.</p>
  </ol>

  <h3 id="discovering">Discovering peers</h3>

  <p>To discover peers that are available to connect to, call {@link
  android.net.wifi.p2p.WifiP2pManager#discoverPeers discoverPeers()} to detect
  available peers that are in range. The call to this function is asynchronous and a success or
  failure is communicated to your application with {@link
  android.net.wifi.p2p.WifiP2pManager.ActionListener#onSuccess onSuccess()} and {@link
  android.net.wifi.p2p.WifiP2pManager.ActionListener#onFailure onFailure()} if you created a 
  {@link android.net.wifi.p2p.WifiP2pManager.ActionListener}. The
  {@link android.net.wifi.p2p.WifiP2pManager.ActionListener#onSuccess onSuccess()} method only notifies you
  that the discovery process succeeded and does not provide any information about the actual peers
  that it discovered, if any:</p>
  <pre>
mManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
    &#064;Override
    public void onSuccess() {
        ...
    }

    &#064;Override
    public void onFailure(int reasonCode) {
        ...
    }
});

</pre>

<p>If the discovery process succeeds and detects peers, the system broadcasts the {@link
  android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION} intent, which you can listen
  for in a broadcast receiver to obtain a list of peers. When your application receives the {@link
  android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION} intent, you can request a
  list of the discovered peers with {@link
  android.net.wifi.p2p.WifiP2pManager#requestPeers requestPeers()}. The following code shows how to set this up:</p>
  <pre>
PeerListListener myPeerListListener;
...
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, myPeerListListener);
    }
}
</pre>

  <p>The {@link android.net.wifi.p2p.WifiP2pManager#requestPeers requestPeers()} method is also
  asynchronous and can notify your activity when a list of peers is available with {@link
  android.net.wifi.p2p.WifiP2pManager.PeerListListener#onPeersAvailable onPeersAvailable()}, which is defined in
  the {@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface. The {@link
  android.net.wifi.p2p.WifiP2pManager.PeerListListener#onPeersAvailable onPeersAvailable()} method
  provides you with an {@link android.net.wifi.p2p.WifiP2pDeviceList}, which you can iterate
  through to find the peer that you want to connect to.</p>

  <h3 id="connecting">Connecting to peers</h3>

  <p>When you have figured out the device that you want to connect to after obtaining a list of
  possible peers, call the {@link android.net.wifi.p2p.WifiP2pManager#connect connect()} method to
  connect to the device. This method call requires a {@link android.net.wifi.p2p.WifiP2pConfig}
  object that contains the information of the device to connect to.
  You can be notified of a connection success or failure through the {@link
  android.net.wifi.p2p.WifiP2pManager.ActionListener}. The following code
  shows you how to create a connection to a desired device:</p>
  <pre>
//obtain a peer from the WifiP2pDeviceList
WifiP2pDevice device;
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
mManager.connect(mChannel, config, new ActionListener() {

    &#064;Override
    public void onSuccess() {
        //success logic
    }

    &#064;Override
    public void onFailure(int reason) {
        //failure logic
    }
});

</pre>


  <h3 id="transferring">Transferring data</h3>
  <p>Once a connection is established, you can transfer data between the devices with
  sockets. The basic steps of transferring data are as follows:</p>

  <ol>
    <li>Create a {@link java.net.ServerSocket}. This socket waits for a connection from a client on a specified
    port and blocks until it happens, so do this in a background thread.</li>

    <li>Create a client {@link java.net.Socket}. The client uses the IP address and port of
    the server socket to connect to the server device.</li>

    <li>Send data from the client to the server. When the client
    socket successfully connects to the server socket, you can send data from the client to the server
    with byte streams. </li>

    <li>The server socket waits for a client connection (with the {@link java.net.ServerSocket#accept()} method). This
    call blocks until a client connects, so call this is another thread. When a connection happens, the server device can receive
    the data from the client. Carry out any actions with this data, such as saving it to a file
    or presenting it to the user.</li>
  </ol>

  <p>The following example, modified from the <a href=
  "{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi P2P Demo</a> sample, shows you how
  to create this client-server socket communication and transfer JPEG images from a client
  to a server with a service. For a complete working example, compile and run the <a href=
  "{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi P2P Demo</a> sample.</p>
<pre>
public static class FileServerAsyncTask extends AsyncTask<Void, Void, String> {

    private Context context;
    private TextView statusText;

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

    &#064;Override
    protected String doInBackground(Void... params) {
        try {

            /**
             * Create a server socket and wait for client connections. This
             * call blocks until a connection is accepted from a client
             */
            ServerSocket serverSocket = new ServerSocket(8888);
            Socket client = serverSocket.accept();

            /**
             * If this code is reached, a client has connected and transferred data
             * Save the input stream from the client as a JPEG file
             */
            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();
            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;
        }
    }

    /**
     * Start activity that can handle the JPEG image
     */
    &#064;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);
        }
    }
}
</pre>

  <p>On the client, connect to the server socket with a client socket and transfer data. This example
  transfers a JPEG file on the client device's file system.</p>

<pre>
Context context = this.getApplicationContext();
String host;
int port;
int len;
Socket socket = new Socket();
byte buf[]  = new byte[1024];
...
try {
    /**
     * Create a client socket with the host,
     * port, and timeout information.
     */
    socket.bind(null);
    socket.connect((new InetSocketAddress(host, port)), 500);

    /**
     * Create a byte stream from a JPEG file and pipe it to the output stream
     * of the socket. This data will be retrieved by the server device.
     */
    OutputStream outputStream = socket.getOutputStream();
    ContentResolver cr = context.getContentResolver();
    InputStream inputStream = null;
    inputStream = cr.openInputStream(Uri.parse("path/to/picture.jpg"));
    while ((len = inputStream.read(buf)) != -1) {
        outputStream.write(buf, 0, len);
    }
    outputStream.close();
    inputStream.close();
} catch (FileNotFoundException e) {
    //catch logic
} catch (IOException e) {
    //catch logic
}

/**
 * Clean up any open sockets when done
 * transferring or if an exception occurred.
 */
finally {
    if (socket != null) {
        if (socket.isConnected()) {
            try {
                socket.close();
            } catch (IOException e) {
                //catch logic
            }
        }
    }
}
</pre>
