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

Commit f82cc0d

Browse files
committed
Remove Camera permission
If `enableImageCapture()` or `enableVideoCapture()` is enabled then `android.permission.CAMERA` is need to be declared in app's manifest file manually.
1 parent 3cc331d commit f82cc0d

4 files changed

Lines changed: 96 additions & 62 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.jaiselrahman.filepickersample">
44

5+
<uses-permission android:name="android.permission.CAMERA" />
6+
57
<application
68
android:allowBackup="true"
79
android:icon="@mipmap/ic_launcher"

filepicker/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.jaiselrahman.filepicker">
44

5-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
65
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
7-
<uses-permission android:name="android.permission.CAMERA" />
86

97
<application>
108
<provider

filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,14 @@
2525
import android.net.Uri;
2626
import android.os.Build;
2727
import android.os.Bundle;
28-
import androidx.annotation.NonNull;
29-
import androidx.core.content.ContextCompat;
30-
import androidx.appcompat.app.AppCompatActivity;
31-
import androidx.recyclerview.widget.GridLayoutManager;
32-
import androidx.recyclerview.widget.RecyclerView;
33-
import androidx.appcompat.widget.Toolbar;
3428
import android.view.Menu;
3529
import android.view.MenuItem;
3630
import android.widget.Toast;
3731

3832
import com.jaiselrahman.filepicker.R;
3933
import com.jaiselrahman.filepicker.adapter.FileGalleryAdapter;
40-
import com.jaiselrahman.filepicker.adapter.MultiSelectionAdapter;
34+
import com.jaiselrahman.filepicker.adapter.FileGalleryAdapter.OnCameraClickListener;
35+
import com.jaiselrahman.filepicker.adapter.MultiSelectionAdapter.OnSelectionListener;
4136
import com.jaiselrahman.filepicker.config.Configurations;
4237
import com.jaiselrahman.filepicker.loader.FileLoader;
4338
import com.jaiselrahman.filepicker.loader.FileResultCallback;
@@ -47,20 +42,24 @@
4742
import java.io.File;
4843
import java.util.ArrayList;
4944

45+
import androidx.annotation.NonNull;
46+
import androidx.appcompat.app.AppCompatActivity;
47+
import androidx.appcompat.widget.Toolbar;
48+
import androidx.core.content.ContextCompat;
49+
import androidx.recyclerview.widget.GridLayoutManager;
50+
import androidx.recyclerview.widget.RecyclerView;
51+
5052
public class FilePickerActivity extends AppCompatActivity
51-
implements MultiSelectionAdapter.OnSelectionListener<FileGalleryAdapter.ViewHolder> {
53+
implements OnSelectionListener<FileGalleryAdapter.ViewHolder>, OnCameraClickListener {
5254
public static final String MEDIA_FILES = "MEDIA_FILES";
5355
public static final String SELECTED_MEDIA_FILES = "SELECTED_MEDIA_FILES";
5456
public static final String CONFIGS = "CONFIGS";
5557
public static final String TAG = "FilePicker";
5658
private static final String PATH = "PATH";
5759
private static final String URI = "URI";
58-
private static final int REQUEST_PERMISSION = 1;
59-
public final String[] permissions = new String[]{
60-
Manifest.permission.READ_EXTERNAL_STORAGE,
61-
Manifest.permission.WRITE_EXTERNAL_STORAGE,
62-
Manifest.permission.CAMERA
63-
};
60+
private static final int REQUEST_WRITE_PERMISSION = 1;
61+
private static final int REQUEST_CAMERA_PERMISSION_FOR_CAMERA = 2;
62+
private static final int REQUEST_CAMERA_PERMISSION_FOR_VIDEO = 3;
6463
private Configurations configs;
6564
private ArrayList<MediaFile> mediaFiles = new ArrayList<>();
6665
private FileGalleryAdapter fileGalleryAdapter;
@@ -104,27 +103,16 @@ protected void onCreate(Bundle savedInstanceState) {
104103
fileGalleryAdapter.setSingleChoiceMode(isSingleChoice);
105104
fileGalleryAdapter.setMaxSelection(isSingleChoice ? 1 : configs.getMaxSelection());
106105
fileGalleryAdapter.setSelectedItems(configs.getSelectedMediaFiles());
106+
fileGalleryAdapter.setOnCameraClickListener(this);
107107
RecyclerView recyclerView = findViewById(R.id.file_gallery);
108108
recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount));
109109
recyclerView.setAdapter(fileGalleryAdapter);
110110
recyclerView.addItemDecoration(new DividerItemDecoration(this));
111111
recyclerView.setItemAnimator(null);
112112

113113
if (savedInstanceState == null) {
114-
boolean success = false;
115-
for (String permission : permissions) {
116-
success = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
117-
if (!success) break;
118-
}
119-
if (success)
114+
if (requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_WRITE_PERMISSION)) {
120115
loadFiles(false);
121-
else if (configs.isCheckPermission()) {
122-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
123-
requestPermissions(permissions, REQUEST_PERMISSION);
124-
}
125-
} else {
126-
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
127-
finish();
128116
}
129117
} else {
130118
loadFiles(false);
@@ -152,10 +140,18 @@ public void onResult(ArrayList<MediaFile> filesResults) {
152140
@Override
153141
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
154142
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
155-
if (requestCode == REQUEST_PERMISSION) {
156-
if (grantResults[0] == PackageManager.PERMISSION_GRANTED
157-
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
143+
if (requestCode == REQUEST_WRITE_PERMISSION) {
144+
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
158145
loadFiles(false);
146+
} else {
147+
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
148+
finish();
149+
}
150+
} else if (requestCode == REQUEST_CAMERA_PERMISSION_FOR_CAMERA || requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO) {
151+
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
152+
fileGalleryAdapter.openCamera(requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO);
153+
} else {
154+
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
159155
}
160156
}
161157
}
@@ -233,6 +229,29 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) {
233229
}
234230
}
235231

232+
@Override
233+
public boolean onCameraClick(boolean forVideo) {
234+
return requestPermission(
235+
Manifest.permission.CAMERA,
236+
forVideo ? REQUEST_CAMERA_PERMISSION_FOR_VIDEO : REQUEST_CAMERA_PERMISSION_FOR_CAMERA
237+
);
238+
}
239+
240+
public boolean requestPermission(String permission, int requestCode) {
241+
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
242+
if (configs.isCheckPermission()) {
243+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
244+
requestPermissions(new String[]{permission}, requestCode);
245+
}
246+
} else {
247+
Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show();
248+
finish();
249+
}
250+
return false;
251+
}
252+
return true;
253+
}
254+
236255
@Override
237256
public void onSelectionBegin() {
238257

filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class FileGalleryAdapter extends MultiSelectionAdapter<FileGalleryAdapter
5858
private Activity activity;
5959
private RequestManager glideRequest;
6060
private OnSelectionListener<ViewHolder> onSelectionListener;
61+
private OnCameraClickListener onCameraClickListener;
6162
private boolean showCamera;
6263
private boolean showVideoCamera;
6364
private File lastCapturedFile;
@@ -165,44 +166,50 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
165166
holder.fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
166167
}
167168

168-
private void handleCamera(ImageView openCamera, final boolean forVideo) {
169+
private void handleCamera(final ImageView openCamera, final boolean forVideo) {
169170
openCamera.setVisibility(View.VISIBLE);
170171
openCamera.setOnClickListener(new View.OnClickListener() {
171172
@Override
172173
public void onClick(View v) {
173-
Intent intent;
174-
String fileName;
175-
File dir;
176-
Uri externalContentUri;
177-
if (forVideo) {
178-
intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
179-
fileName = "/VID_" + getTimeStamp() + ".mp4";
180-
dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES);
181-
externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
182-
} else {
183-
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
184-
dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
185-
fileName = "/IMG_" + getTimeStamp() + ".jpeg";
186-
externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
187-
}
188-
if (!dir.exists() && !dir.mkdir()) {
189-
Log.d(TAG, "onClick: " +
190-
(forVideo ? "MOVIES" : "PICTURES") + " Directory not exists");
174+
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(forVideo))
191175
return;
192-
}
193-
lastCapturedFile = new File(dir.getAbsolutePath() + fileName);
176+
openCamera(forVideo);
177+
}
178+
});
179+
}
194180

195-
Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile);
181+
public void openCamera(boolean forVideo) {
182+
Intent intent;
183+
String fileName;
184+
File dir;
185+
Uri externalContentUri;
186+
if (forVideo) {
187+
intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
188+
fileName = "/VID_" + getTimeStamp() + ".mp4";
189+
dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES);
190+
externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
191+
} else {
192+
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
193+
dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
194+
fileName = "/IMG_" + getTimeStamp() + ".jpeg";
195+
externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
196+
}
197+
if (!dir.exists() && !dir.mkdir()) {
198+
Log.d(TAG, "onClick: " +
199+
(forVideo ? "MOVIES" : "PICTURES") + " Directory not exists");
200+
return;
201+
}
202+
lastCapturedFile = new File(dir.getAbsolutePath() + fileName);
196203

197-
ContentValues values = new ContentValues();
198-
values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath());
199-
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());
200-
lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values);
204+
Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile);
201205

202-
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
203-
activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO);
204-
}
205-
});
206+
ContentValues values = new ContentValues();
207+
values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath());
208+
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());
209+
lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values);
210+
211+
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
212+
activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO);
206213
}
207214

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

224+
public void setOnCameraClickListener(OnCameraClickListener onCameraClickListener) {
225+
this.onCameraClickListener = onCameraClickListener;
226+
}
227+
217228
@Override
218229
public int getItemCount() {
219230
if (showCamera) {
@@ -292,4 +303,8 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
292303
fileSelected = v.findViewById(R.id.file_selected);
293304
}
294305
}
306+
307+
public interface OnCameraClickListener {
308+
boolean onCameraClick(boolean forVideo);
309+
}
295310
}

0 commit comments

Comments
 (0)