1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2015 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicpermissions;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import com.example.android.basicpermissions.camera.CameraPreviewActivity;
20*90c8c64dSAndroid Build Coastguard Worker 
21*90c8c64dSAndroid Build Coastguard Worker import android.Manifest;
22*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity;
23*90c8c64dSAndroid Build Coastguard Worker import android.content.Context;
24*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
25*90c8c64dSAndroid Build Coastguard Worker import android.content.pm.PackageManager;
26*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
27*90c8c64dSAndroid Build Coastguard Worker import android.support.design.widget.Snackbar;
28*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.app.ActivityCompat;
29*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.app.AppCompatActivity;
30*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
31*90c8c64dSAndroid Build Coastguard Worker import android.widget.Button;
32*90c8c64dSAndroid Build Coastguard Worker 
33*90c8c64dSAndroid Build Coastguard Worker /**
34*90c8c64dSAndroid Build Coastguard Worker  * Launcher Activity that demonstrates the use of runtime permissions for Android M.
35*90c8c64dSAndroid Build Coastguard Worker  * This Activity requests permissions to access the camera
36*90c8c64dSAndroid Build Coastguard Worker  * ({@link android.Manifest.permission#CAMERA})
37*90c8c64dSAndroid Build Coastguard Worker  * when the 'Show Camera Preview' button is clicked to start  {@link CameraPreviewActivity} once
38*90c8c64dSAndroid Build Coastguard Worker  * the permission has been granted.
39*90c8c64dSAndroid Build Coastguard Worker  * <p>
40*90c8c64dSAndroid Build Coastguard Worker  * First, the status of the Camera permission is checked using {@link
41*90c8c64dSAndroid Build Coastguard Worker  * ActivityCompat#checkSelfPermission(Context, String)}
42*90c8c64dSAndroid Build Coastguard Worker  * If it has not been granted ({@link PackageManager#PERMISSION_GRANTED}), it is requested by
43*90c8c64dSAndroid Build Coastguard Worker  * calling
44*90c8c64dSAndroid Build Coastguard Worker  * {@link ActivityCompat#requestPermissions(Activity, String[], int)}. The result of the request is
45*90c8c64dSAndroid Build Coastguard Worker  * returned to the
46*90c8c64dSAndroid Build Coastguard Worker  * {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}, which starts
47*90c8c64dSAndroid Build Coastguard Worker  * {@link
48*90c8c64dSAndroid Build Coastguard Worker  * CameraPreviewActivity} if the permission has been granted.
49*90c8c64dSAndroid Build Coastguard Worker  * <p>
50*90c8c64dSAndroid Build Coastguard Worker  * Note that there is no need to check the API level, the support library
51*90c8c64dSAndroid Build Coastguard Worker  * already takes care of this. Similar helper methods for permissions are also available in
52*90c8c64dSAndroid Build Coastguard Worker  * ({@link ActivityCompat},
53*90c8c64dSAndroid Build Coastguard Worker  * {@link android.support.v4.content.ContextCompat} and {@link android.support.v4.app.Fragment}).
54*90c8c64dSAndroid Build Coastguard Worker  */
55*90c8c64dSAndroid Build Coastguard Worker public class MainActivity extends AppCompatActivity
56*90c8c64dSAndroid Build Coastguard Worker         implements ActivityCompat.OnRequestPermissionsResultCallback {
57*90c8c64dSAndroid Build Coastguard Worker 
58*90c8c64dSAndroid Build Coastguard Worker     private static final int PERMISSION_REQUEST_CAMERA = 0;
59*90c8c64dSAndroid Build Coastguard Worker 
60*90c8c64dSAndroid Build Coastguard Worker     private View mLayout;
61*90c8c64dSAndroid Build Coastguard Worker 
62*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)63*90c8c64dSAndroid Build Coastguard Worker     protected void onCreate(Bundle savedInstanceState) {
64*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
65*90c8c64dSAndroid Build Coastguard Worker         setContentView(R.layout.activity_main);
66*90c8c64dSAndroid Build Coastguard Worker         mLayout = findViewById(R.id.main_layout);
67*90c8c64dSAndroid Build Coastguard Worker 
68*90c8c64dSAndroid Build Coastguard Worker         // Register a listener for the 'Show Camera Preview' button.
69*90c8c64dSAndroid Build Coastguard Worker         Button b = (Button) findViewById(R.id.button_open_camera);
70*90c8c64dSAndroid Build Coastguard Worker         b.setOnClickListener(new View.OnClickListener() {
71*90c8c64dSAndroid Build Coastguard Worker             @Override
72*90c8c64dSAndroid Build Coastguard Worker             public void onClick(View view) {
73*90c8c64dSAndroid Build Coastguard Worker                 showCameraPreview();
74*90c8c64dSAndroid Build Coastguard Worker             }
75*90c8c64dSAndroid Build Coastguard Worker         });
76*90c8c64dSAndroid Build Coastguard Worker     }
77*90c8c64dSAndroid Build Coastguard Worker 
78*90c8c64dSAndroid Build Coastguard Worker     @Override
onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)79*90c8c64dSAndroid Build Coastguard Worker     public void onRequestPermissionsResult(int requestCode, String[] permissions,
80*90c8c64dSAndroid Build Coastguard Worker             int[] grantResults) {
81*90c8c64dSAndroid Build Coastguard Worker         // BEGIN_INCLUDE(onRequestPermissionsResult)
82*90c8c64dSAndroid Build Coastguard Worker         if (requestCode == PERMISSION_REQUEST_CAMERA) {
83*90c8c64dSAndroid Build Coastguard Worker             // Request for camera permission.
84*90c8c64dSAndroid Build Coastguard Worker             if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
85*90c8c64dSAndroid Build Coastguard Worker                 // Permission has been granted. Start camera preview Activity.
86*90c8c64dSAndroid Build Coastguard Worker                 Snackbar.make(mLayout, "Camera permission was granted. Starting preview.",
87*90c8c64dSAndroid Build Coastguard Worker                         Snackbar.LENGTH_SHORT)
88*90c8c64dSAndroid Build Coastguard Worker                         .show();
89*90c8c64dSAndroid Build Coastguard Worker                 startCamera();
90*90c8c64dSAndroid Build Coastguard Worker             } else {
91*90c8c64dSAndroid Build Coastguard Worker                 // Permission request was denied.
92*90c8c64dSAndroid Build Coastguard Worker                 Snackbar.make(mLayout, "Camera permission request was denied.",
93*90c8c64dSAndroid Build Coastguard Worker                         Snackbar.LENGTH_SHORT)
94*90c8c64dSAndroid Build Coastguard Worker                         .show();
95*90c8c64dSAndroid Build Coastguard Worker             }
96*90c8c64dSAndroid Build Coastguard Worker         }
97*90c8c64dSAndroid Build Coastguard Worker         // END_INCLUDE(onRequestPermissionsResult)
98*90c8c64dSAndroid Build Coastguard Worker     }
99*90c8c64dSAndroid Build Coastguard Worker 
showCameraPreview()100*90c8c64dSAndroid Build Coastguard Worker     private void showCameraPreview() {
101*90c8c64dSAndroid Build Coastguard Worker         // BEGIN_INCLUDE(startCamera)
102*90c8c64dSAndroid Build Coastguard Worker         // Check if the Camera permission has been granted
103*90c8c64dSAndroid Build Coastguard Worker         if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
104*90c8c64dSAndroid Build Coastguard Worker                 == PackageManager.PERMISSION_GRANTED) {
105*90c8c64dSAndroid Build Coastguard Worker             // Permission is already available, start camera preview
106*90c8c64dSAndroid Build Coastguard Worker             Snackbar.make(mLayout,
107*90c8c64dSAndroid Build Coastguard Worker                     "Camera permission is available. Starting preview.",
108*90c8c64dSAndroid Build Coastguard Worker                     Snackbar.LENGTH_SHORT).show();
109*90c8c64dSAndroid Build Coastguard Worker             startCamera();
110*90c8c64dSAndroid Build Coastguard Worker         } else {
111*90c8c64dSAndroid Build Coastguard Worker             // Permission is missing and must be requested.
112*90c8c64dSAndroid Build Coastguard Worker             requestCameraPermission();
113*90c8c64dSAndroid Build Coastguard Worker         }
114*90c8c64dSAndroid Build Coastguard Worker         // END_INCLUDE(startCamera)
115*90c8c64dSAndroid Build Coastguard Worker     }
116*90c8c64dSAndroid Build Coastguard Worker 
117*90c8c64dSAndroid Build Coastguard Worker     /**
118*90c8c64dSAndroid Build Coastguard Worker      * Requests the {@link android.Manifest.permission#CAMERA} permission.
119*90c8c64dSAndroid Build Coastguard Worker      * If an additional rationale should be displayed, the user has to launch the request from
120*90c8c64dSAndroid Build Coastguard Worker      * a SnackBar that includes additional information.
121*90c8c64dSAndroid Build Coastguard Worker      */
requestCameraPermission()122*90c8c64dSAndroid Build Coastguard Worker     private void requestCameraPermission() {
123*90c8c64dSAndroid Build Coastguard Worker         // Permission has not been granted and must be requested.
124*90c8c64dSAndroid Build Coastguard Worker         if (ActivityCompat.shouldShowRequestPermissionRationale(this,
125*90c8c64dSAndroid Build Coastguard Worker                 Manifest.permission.CAMERA)) {
126*90c8c64dSAndroid Build Coastguard Worker             // Provide an additional rationale to the user if the permission was not granted
127*90c8c64dSAndroid Build Coastguard Worker             // and the user would benefit from additional context for the use of the permission.
128*90c8c64dSAndroid Build Coastguard Worker             // Display a SnackBar with a button to request the missing permission.
129*90c8c64dSAndroid Build Coastguard Worker             Snackbar.make(mLayout, "Camera access is required to display the camera preview.",
130*90c8c64dSAndroid Build Coastguard Worker                     Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() {
131*90c8c64dSAndroid Build Coastguard Worker                 @Override
132*90c8c64dSAndroid Build Coastguard Worker                 public void onClick(View view) {
133*90c8c64dSAndroid Build Coastguard Worker                     // Request the permission
134*90c8c64dSAndroid Build Coastguard Worker                     ActivityCompat.requestPermissions(MainActivity.this,
135*90c8c64dSAndroid Build Coastguard Worker                             new String[]{Manifest.permission.CAMERA},
136*90c8c64dSAndroid Build Coastguard Worker                             PERMISSION_REQUEST_CAMERA);
137*90c8c64dSAndroid Build Coastguard Worker                 }
138*90c8c64dSAndroid Build Coastguard Worker             }).show();
139*90c8c64dSAndroid Build Coastguard Worker 
140*90c8c64dSAndroid Build Coastguard Worker         } else {
141*90c8c64dSAndroid Build Coastguard Worker             Snackbar.make(mLayout,
142*90c8c64dSAndroid Build Coastguard Worker                     "Permission is not available. Requesting camera permission.",
143*90c8c64dSAndroid Build Coastguard Worker                     Snackbar.LENGTH_SHORT).show();
144*90c8c64dSAndroid Build Coastguard Worker             // Request the permission. The result will be received in onRequestPermissionResult().
145*90c8c64dSAndroid Build Coastguard Worker             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
146*90c8c64dSAndroid Build Coastguard Worker                     PERMISSION_REQUEST_CAMERA);
147*90c8c64dSAndroid Build Coastguard Worker         }
148*90c8c64dSAndroid Build Coastguard Worker     }
149*90c8c64dSAndroid Build Coastguard Worker 
startCamera()150*90c8c64dSAndroid Build Coastguard Worker     private void startCamera() {
151*90c8c64dSAndroid Build Coastguard Worker         Intent intent = new Intent(this, CameraPreviewActivity.class);
152*90c8c64dSAndroid Build Coastguard Worker         startActivity(intent);
153*90c8c64dSAndroid Build Coastguard Worker     }
154*90c8c64dSAndroid Build Coastguard Worker 
155*90c8c64dSAndroid Build Coastguard Worker }
156