Skip to content
This repository has been archived by the owner on Mar 30, 2024. It is now read-only.

Commit

Permalink
Remove Camera permission
Browse files Browse the repository at this point in the history
If `enableImageCapture()` or `enableVideoCapture()` is enabled then
`android.permission.CAMERA` is need to be declared in app's manifest
file manually.
  • Loading branch information
jaiselrahman committed Feb 27, 2019
1 parent 3cc331d commit f82cc0d
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 62 deletions.
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jaiselrahman.filepickersample">

<uses-permission android:name="android.permission.CAMERA" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Expand Down
2 changes: 0 additions & 2 deletions filepicker/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jaiselrahman.filepicker">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

<application>
<provider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,14 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.jaiselrahman.filepicker.R;
import com.jaiselrahman.filepicker.adapter.FileGalleryAdapter;
import com.jaiselrahman.filepicker.adapter.MultiSelectionAdapter;
import com.jaiselrahman.filepicker.adapter.FileGalleryAdapter.OnCameraClickListener;
import com.jaiselrahman.filepicker.adapter.MultiSelectionAdapter.OnSelectionListener;
import com.jaiselrahman.filepicker.config.Configurations;
import com.jaiselrahman.filepicker.loader.FileLoader;
import com.jaiselrahman.filepicker.loader.FileResultCallback;
Expand All @@ -47,20 +42,24 @@
import java.io.File;
import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class FilePickerActivity extends AppCompatActivity
implements MultiSelectionAdapter.OnSelectionListener<FileGalleryAdapter.ViewHolder> {
implements OnSelectionListener<FileGalleryAdapter.ViewHolder>, OnCameraClickListener {
public static final String MEDIA_FILES = "MEDIA_FILES";
public static final String SELECTED_MEDIA_FILES = "SELECTED_MEDIA_FILES";
public static final String CONFIGS = "CONFIGS";
public static final String TAG = "FilePicker";
private static final String PATH = "PATH";
private static final String URI = "URI";
private static final int REQUEST_PERMISSION = 1;
public final String[] permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
private static final int REQUEST_WRITE_PERMISSION = 1;
private static final int REQUEST_CAMERA_PERMISSION_FOR_CAMERA = 2;
private static final int REQUEST_CAMERA_PERMISSION_FOR_VIDEO = 3;
private Configurations configs;
private ArrayList<MediaFile> mediaFiles = new ArrayList<>();
private FileGalleryAdapter fileGalleryAdapter;
Expand Down Expand Up @@ -104,27 +103,16 @@ protected void onCreate(Bundle savedInstanceState) {
fileGalleryAdapter.setSingleChoiceMode(isSingleChoice);
fileGalleryAdapter.setMaxSelection(isSingleChoice ? 1 : configs.getMaxSelection());
fileGalleryAdapter.setSelectedItems(configs.getSelectedMediaFiles());
fileGalleryAdapter.setOnCameraClickListener(this);
RecyclerView recyclerView = findViewById(R.id.file_gallery);
recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount));
recyclerView.setAdapter(fileGalleryAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(this));
recyclerView.setItemAnimator(null);

if (savedInstanceState == null) {
boolean success = false;
for (String permission : permissions) {
success = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
if (!success) break;
}
if (success)
if (requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_WRITE_PERMISSION)) {
loadFiles(false);
else if (configs.isCheckPermission()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, REQUEST_PERMISSION);
}
} else {
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
finish();
}
} else {
loadFiles(false);
Expand Down Expand Up @@ -152,10 +140,18 @@ public void onResult(ArrayList<MediaFile> filesResults) {
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
if (requestCode == REQUEST_WRITE_PERMISSION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
loadFiles(false);
} else {
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
finish();
}
} else if (requestCode == REQUEST_CAMERA_PERMISSION_FOR_CAMERA || requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
fileGalleryAdapter.openCamera(requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO);
} else {
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
}
}
}
Expand Down Expand Up @@ -233,6 +229,29 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) {
}
}

@Override
public boolean onCameraClick(boolean forVideo) {
return requestPermission(
Manifest.permission.CAMERA,
forVideo ? REQUEST_CAMERA_PERMISSION_FOR_VIDEO : REQUEST_CAMERA_PERMISSION_FOR_CAMERA
);
}

public boolean requestPermission(String permission, int requestCode) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
if (configs.isCheckPermission()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
finish();
}
return false;
}
return true;
}

@Override
public void onSelectionBegin() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public class FileGalleryAdapter extends MultiSelectionAdapter<FileGalleryAdapter
private Activity activity;
private RequestManager glideRequest;
private OnSelectionListener<ViewHolder> onSelectionListener;
private OnCameraClickListener onCameraClickListener;
private boolean showCamera;
private boolean showVideoCamera;
private File lastCapturedFile;
Expand Down Expand Up @@ -165,44 +166,50 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
}

private void handleCamera(ImageView openCamera, final boolean forVideo) {
private void handleCamera(final ImageView openCamera, final boolean forVideo) {
openCamera.setVisibility(View.VISIBLE);
openCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent;
String fileName;
File dir;
Uri externalContentUri;
if (forVideo) {
intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileName = "/VID_" + getTimeStamp() + ".mp4";
dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES);
externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else {
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
fileName = "/IMG_" + getTimeStamp() + ".jpeg";
externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
if (!dir.exists() && !dir.mkdir()) {
Log.d(TAG, "onClick: " +
(forVideo ? "MOVIES" : "PICTURES") + " Directory not exists");
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(forVideo))
return;
}
lastCapturedFile = new File(dir.getAbsolutePath() + fileName);
openCamera(forVideo);
}
});
}

Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile);
public void openCamera(boolean forVideo) {
Intent intent;
String fileName;
File dir;
Uri externalContentUri;
if (forVideo) {
intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileName = "/VID_" + getTimeStamp() + ".mp4";
dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES);
externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else {
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
fileName = "/IMG_" + getTimeStamp() + ".jpeg";
externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
if (!dir.exists() && !dir.mkdir()) {
Log.d(TAG, "onClick: " +
(forVideo ? "MOVIES" : "PICTURES") + " Directory not exists");
return;
}
lastCapturedFile = new File(dir.getAbsolutePath() + fileName);

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath());
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());
lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values);
Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile);

intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO);
}
});
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath());
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());
lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values);

intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO);
}

private String getTimeStamp() {
Expand All @@ -214,6 +221,10 @@ public void setOnSelectionListener(OnSelectionListener<ViewHolder> onSelectionLi
this.onSelectionListener = onSelectionListener;
}

public void setOnCameraClickListener(OnCameraClickListener onCameraClickListener) {
this.onCameraClickListener = onCameraClickListener;
}

@Override
public int getItemCount() {
if (showCamera) {
Expand Down Expand Up @@ -292,4 +303,8 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
fileSelected = v.findViewById(R.id.file_selected);
}
}

public interface OnCameraClickListener {
boolean onCameraClick(boolean forVideo);
}
}

0 comments on commit f82cc0d

Please sign in to comment.