diff --git a/samples/WiFiDirectDemo/Android.mk b/samples/WiFiDirectDemo/Android.mk index 36c5d458f..5a76260f3 100644 --- a/samples/WiFiDirectDemo/Android.mk +++ b/samples/WiFiDirectDemo/Android.mk @@ -6,6 +6,9 @@ LOCAL_MODULE_TAGS := samples # Only compile source java files in this apk. LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_STATIC_ANDROID_LIBRARIES += \ + android-support-v4 + LOCAL_PACKAGE_NAME := WiFiDirectDemo LOCAL_SDK_VERSION := current diff --git a/samples/WiFiDirectDemo/AndroidManifest.xml b/samples/WiFiDirectDemo/AndroidManifest.xml index d25fdc001..44985e89b 100644 --- a/samples/WiFiDirectDemo/AndroidManifest.xml +++ b/samples/WiFiDirectDemo/AndroidManifest.xml @@ -2,7 +2,8 @@ - + + @@ -10,6 +11,7 @@ + @@ -29,6 +31,16 @@ + + + + diff --git a/samples/WiFiDirectDemo/res/xml/provider_paths.xml b/samples/WiFiDirectDemo/res/xml/provider_paths.xml new file mode 100644 index 000000000..28fb40668 --- /dev/null +++ b/samples/WiFiDirectDemo/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + + diff --git a/samples/WiFiDirectDemo/src/com/example/android/wifidirect/DeviceDetailFragment.java b/samples/WiFiDirectDemo/src/com/example/android/wifidirect/DeviceDetailFragment.java index f74afaee1..c999ece9b 100644 --- a/samples/WiFiDirectDemo/src/com/example/android/wifidirect/DeviceDetailFragment.java +++ b/samples/WiFiDirectDemo/src/com/example/android/wifidirect/DeviceDetailFragment.java @@ -19,7 +19,6 @@ package com.example.android.wifidirect; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.net.wifi.WpsInfo; @@ -29,7 +28,7 @@ import android.net.wifi.p2p.WifiP2pInfo; import android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Environment; +import android.support.v4.content.FileProvider; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -228,8 +227,8 @@ public class DeviceDetailFragment extends Fragment implements ConnectionInfoList 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() + final File f = new File(context.getExternalFilesDir("received"), + "wifip2pshared-" + System.currentTimeMillis() + ".jpg"); File dirs = new File(f.getParent()); @@ -256,9 +255,16 @@ public class DeviceDetailFragment extends Fragment implements ConnectionInfoList protected void onPostExecute(String result) { if (result != null) { statusText.setText("File copied - " + result); + + File recvFile = new File(result); + Uri fileUri = FileProvider.getUriForFile( + context, + "com.example.android.wifidirect.fileprovider", + recvFile); Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); - intent.setDataAndType(Uri.parse("file://" + result), "image/*"); + intent.setDataAndType(fileUri, "image/*"); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent); } diff --git a/samples/WiFiDirectDemo/src/com/example/android/wifidirect/WiFiDirectActivity.java b/samples/WiFiDirectDemo/src/com/example/android/wifidirect/WiFiDirectActivity.java index 2e51c3dde..aaec70828 100644 --- a/samples/WiFiDirectDemo/src/com/example/android/wifidirect/WiFiDirectActivity.java +++ b/samples/WiFiDirectDemo/src/com/example/android/wifidirect/WiFiDirectActivity.java @@ -16,17 +16,20 @@ package com.example.android.wifidirect; +import android.Manifest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pManager.ActionListener; import android.net.wifi.p2p.WifiP2pManager.Channel; import android.net.wifi.p2p.WifiP2pManager.ChannelListener; +import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.util.Log; @@ -48,6 +51,9 @@ import com.example.android.wifidirect.DeviceListFragment.DeviceActionListener; public class WiFiDirectActivity extends Activity implements ChannelListener, DeviceActionListener { public static final String TAG = "wifidirectdemo"; + + private static final int PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION = 1001; + private WifiP2pManager manager; private boolean isWifiP2pEnabled = false; private boolean retryChannel = false; @@ -63,6 +69,19 @@ public class WiFiDirectActivity extends Activity implements ChannelListener, Dev this.isWifiP2pEnabled = isWifiP2pEnabled; } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION: + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + Log.e(TAG, "Coarse location permission is not granted!"); + finish(); + } + break; + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -77,6 +96,15 @@ public class WiFiDirectActivity extends Activity implements ChannelListener, Dev manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); channel = manager.initialize(this, getMainLooper(), null); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, + WiFiDirectActivity.PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION); + // After this point you wait for callback in + // onRequestPermissionsResult(int, String[], int[]) overridden method + } } /** register the BroadcastReceiver with the intent values to be matched */