package com.commonsware.android.perm.tutorial; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.commonsware.cwac.cam2.CameraActivity; import com.commonsware.cwac.cam2.VideoRecorderActivity; import java.io.File; import java.util.ArrayList; import static android.Manifest.permission.CAMERA; import static android.Manifest.permission.RECORD_AUDIO; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; public class MainActivity extends Activity { private static final String[] PERMS_ALL={ CAMERA, WRITE_EXTERNAL_STORAGE, RECORD_AUDIO }; private static final String[] PERMS_TAKE_PICTURE={ CAMERA, WRITE_EXTERNAL_STORAGE }; private static final int RESULT_PICTURE_TAKEN=1337; private static final int RESULT_VIDEO_RECORDED=1338; private static final int RESULT_PERMS_INITIAL=1339; private static final int RESULT_PERMS_TAKE_PICTURE=1340; private static final int RESULT_PERMS_RECORD_VIDEO=1341; private static final String PREF_IS_FIRST_RUN="firstRun"; private static final String STATE_BREADCRUST= "com.commonsware.android.perm.tutorial.breadcrust"; private static final String STATE_IN_PERMISSION= "com.commonsware.android.perm.tutorial.inPermission"; private File rootDir; private SharedPreferences prefs; private TextView breadcrust; private boolean isInPermission=false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (savedInstanceState!=null) { isInPermission= savedInstanceState.getBoolean(STATE_IN_PERMISSION, false); } prefs=PreferenceManager.getDefaultSharedPreferences(this); breadcrust=(TextView)findViewById(R.id.breadcrust); File downloads=Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); rootDir=new File(downloads, "RuntimePermTutorial"); rootDir.mkdirs(); if (isFirstRun() && !isInPermission) { isInPermission=true; ActivityCompat.requestPermissions(this, PERMS_TAKE_PICTURE, RESULT_PERMS_INITIAL); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(STATE_IN_PERMISSION, isInPermission); if (breadcrust.getVisibility()==View.VISIBLE) { outState.putCharSequence(STATE_BREADCRUST, breadcrust.getText()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); CharSequence cs=savedInstanceState.getCharSequence(STATE_BREADCRUST); if (cs!=null) { breadcrust.setVisibility(View.VISIBLE); breadcrust.setText(cs); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Toast t=null; if (resultCode==RESULT_OK) { if (requestCode==RESULT_PICTURE_TAKEN) { t=Toast.makeText(this, R.string.msg_pic_taken, Toast.LENGTH_LONG); } else if (requestCode==RESULT_VIDEO_RECORDED) { t=Toast.makeText(this, R.string.msg_vid_recorded, Toast.LENGTH_LONG); } t.show(); } } public void takePicture(View v) { if (canTakePicture()) { takePictureForRealz(); } else if (breadcrust.getVisibility()==View.GONE && shouldShowTakePictureRationale()) { breadcrust.setText(R.string.msg_take_picture); breadcrust.setVisibility(View.VISIBLE); } else { breadcrust.setVisibility(View.GONE); ActivityCompat.requestPermissions(this, netPermissions(PERMS_TAKE_PICTURE), RESULT_PERMS_TAKE_PICTURE); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { boolean sadTrombone=false; isInPermission=false; if (requestCode==RESULT_PERMS_TAKE_PICTURE) { if (canTakePicture()) { takePictureForRealz(); } else if (!shouldShowTakePictureRationale()) { sadTrombone=true; } } else if (requestCode==RESULT_PERMS_RECORD_VIDEO) { if (canRecordVideo()) { recordVideoForRealz(); } else if (!shouldShowRecordVideoRationale()) { sadTrombone=true; } } if (sadTrombone) { Toast.makeText(this, R.string.msg_no_perm, Toast.LENGTH_LONG).show(); } } public void recordVideo(View v) { if (canRecordVideo()) { recordVideoForRealz(); } else if (breadcrust.getVisibility()==View.GONE && shouldShowRecordVideoRationale()) { breadcrust.setText(R.string.msg_record_video); breadcrust.setVisibility(View.VISIBLE); } else { breadcrust.setVisibility(View.GONE); ActivityCompat.requestPermissions(this, netPermissions(PERMS_ALL), RESULT_PERMS_RECORD_VIDEO); } } private void takePictureForRealz() { Intent i=new CameraActivity.IntentBuilder(MainActivity.this) .to(new File(rootDir, "test.jpg")) .updateMediaStore() .build(); startActivityForResult(i, RESULT_PICTURE_TAKEN); } private void recordVideoForRealz() { Intent i=new VideoRecorderActivity.IntentBuilder(MainActivity.this) .quality(VideoRecorderActivity.Quality.HIGH) .sizeLimit(5000000) .to(new File(rootDir, "test.mp4")) .updateMediaStore() .forceClassic() .build(); startActivityForResult(i, RESULT_VIDEO_RECORDED); } private boolean isFirstRun() { boolean result=prefs.getBoolean(PREF_IS_FIRST_RUN, true); if (result) { prefs.edit().putBoolean(PREF_IS_FIRST_RUN, false).apply(); } return(result); } private boolean hasPermission(String perm) { return(ContextCompat.checkSelfPermission(this, perm)== PackageManager.PERMISSION_GRANTED); } private boolean canTakePicture() { return(hasPermission(CAMERA) && hasPermission(WRITE_EXTERNAL_STORAGE)); } private boolean shouldShowTakePictureRationale() { return(ActivityCompat.shouldShowRequestPermissionRationale( this, CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, WRITE_EXTERNAL_STORAGE)); } private String[] netPermissions(String[] wanted) { ArrayList result=new ArrayList(); for (String perm : wanted) { if (!hasPermission(perm)) { result.add(perm); } } return(result.toArray(new String[result.size()])); } private boolean canRecordVideo() { return(canTakePicture() && hasPermission(RECORD_AUDIO)); } private boolean shouldShowRecordVideoRationale() { return(shouldShowTakePictureRationale() || ActivityCompat.shouldShowRequestPermissionRationale(this, RECORD_AUDIO)); } }