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