We often Pick images from Gallery to upload in android app but sometime when tried in Android version greater than Marshmallow it throw an error that it does not have permission to Uri. So here i am telling you how to use concept of File provider in Android Version after Android Marshmallow .So lets Start from beginning :-
Step 1:
in AndroidManifest.xml add these Permissions
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 2:
in Same AndroidManifest.xml file add
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path" />
</provider>
Step 3:
Create an xml Folder Under res and create a file provider_path.xml and paste this code inside
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
</paths>
Step 4:
in Java file add these code to upload image from gallery or capture from camera
that 's all .
Step 1:
in AndroidManifest.xml add these Permissions
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 2:
in Same AndroidManifest.xml file add
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path" />
</provider>
Step 3:
Create an xml Folder Under res and create a file provider_path.xml and paste this code inside
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
</paths>
Step 4:
in Java file add these code to upload image from gallery or capture from camera
Button btproof;
btproof.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectImage();
}
});
private void selectImage() {
if (ContextCompat.checkSelfPermission(ctx, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
givePermission(); // Take Real time permission from user to access camera and media files
}
} else {
final CharSequence[] options = {
"Take From Camera",
"Choose from Gallery",
"Cancel"
};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a Proof !");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (options[item].equals("Take From Camera"))
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(ctx, ctx.getApplicationContext().getPackageName() + ".provider", f));
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, 1);
} else {
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
f = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 1);
}
} else if (options[item].equals("Choose from Gallery"))
{
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 2);
} else if (options[item].equals("Cancel")) {
btproof.setText("Select Photo ");
dialog.dismiss();
}
}
});
builder.show();
}
}
public String getStringImage(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}
public void givePermission() {
//tedpermission library for real time android permissions
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
}
@Override
public void onPermissionDenied(ArrayList deniedPermissions) {
Toast.makeText(this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
}
};
new TedPermission(this)
.setPermissionListener(permissionlistener)
.setDeniedMessage("If you reject permission,you can not use this service\n\nPlease turn on permissions at [Setting] > [Permission]")
.setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
.check();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
if (requestCode == 1) {
File f = new File(Environment.getExternalStorageDirectory().toString());
for (File temp: f.listFiles()) {
if (temp.getName().equals("temp.jpg")) {
f = temp;
break;
}
}
try {
Bitmap bitmap;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(), bitmapOptions);
ivproof.setImageBitmap(bitmap);
imageString = getStringImage(bitmap);
Toast.makeText(ctx, "Image=" + imageString, Toast.LENGTH_SHORT).show();
btproof.setText("Uploaded");
} catch (Exception e) {
e.printStackTrace();
}
}
if (requestCode == 2) {
Uri selectedImage = data.getData();
String[] filePath = {
MediaStore.Images.Media.DATA
};
Cursor c = this.getContentResolver().query(selectedImage, filePath, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePath[0]);
String picturePath = c.getString(columnIndex);
c.close();
Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));
Log.d("path of image", picturePath + "");
imageString = getStringImage(thumbnail);
ivproof.setImageBitmap(thumbnail);
// Toast.makeText(ctx,"Image="+imageString,Toast.LENGTH_SHORT).show();
btproof.setText("Uploaded");
} else {
Toast.makeText(this, "Something went wrong...", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPause() {
super.onPause();
if (camera != null) {
camera.release(); // release the camera for other applications
camera = null;
}
}
that 's all .
Comments
Post a Comment