Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
Ask Question
Building basic app and getting IllegalArgumentException: Had a Button to launch camera app where I am trying to save image to pictures.
dispatchTakePictureIntent();
method is called when I click Image button
Found few similar issues but that couldn't resolve my issue:
Android: FileProvider IllegalArgumentException Failed to find configured root that contains /data/data/**/files/Videos/final.mp4
FileProvider "Failed to find configured root" exception
Below is my code. Can some one help what I am missing?
public class CatalogDataActivity extends AppCompatActivity {
static final int REQUEST_IMAGE_CAPTURE = 1;
public String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/CatalogData";
@Override
protected void onCreate(Bundle savedInstanceState) {
//verifyStoragePermissions();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catalog_data);
final Button btCamera=(Button)findViewById(R.id.btn_camera);
final Button btSave=(Button)findViewById(R.id.btn_save);
final EditText etProductName=(EditText)findViewById(R.id.et_productName);
final EditText etProductDescription=(EditText)findViewById(R.id.et_description);
final TextView finalText=(TextView)findViewById(R.id.tv_saved_text);
File dir=new File(path);
if(!dir.isDirectory()){
dir.mkdir();
btCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* Intent takePictureIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(takePictureIntent.resolveActivity(getPackageManager())!=null){
startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);
dispatchTakePictureIntent();
btSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newProductDataStr=etProductName.getText()+","+etProductDescription.getText()+"|";
File file=new File(path+"/catalogdata.txt");
System.out.println("Path:"+path);
writeToFile(newProductDataStr,getApplicationContext());
String data=readFromFile(getApplicationContext());
finalText.setText(data);
//finalText.
String []splitData=data.split("|");
//System.out.println(">>>>>>>>>>>>>>>>>>>>////"+splitData.length+"/////>>>>>>>>>>>>>>>>>>"+splitData[splitData.length-4]);
private void writeToFile(String data,Context context) {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("config1.txt", Context.MODE_APPEND));
outputStreamWriter.write(data);
outputStreamWriter.close();
catch (IOException e) {
System.out.println("Exception"+ "File write failed: " + e.toString());
private String readFromFile(Context context) {
String ret = "";
try {
InputStream inputStream = context.openFileInput("config1.txt");
if ( inputStream != null ) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String receiveString = "";
StringBuilder stringBuilder = new StringBuilder();
while ( (receiveString = bufferedReader.readLine()) != null ) {
stringBuilder.append(receiveString);
inputStream.close();
ret = stringBuilder.toString();
catch (FileNotFoundException e) {
Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
Log.e("login activity", "Can not read file: " + e.toString());
return ret;
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data){
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap bitMap = (Bitmap) extras.get("data");
String ImagePath = MediaStore.Images.Media.insertImage(
getContentResolver(),
bitMap,
"demo_image",
"demo_image"
System.out.println("Saved Image in :"+ImagePath);
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
if(!storageDir.isDirectory()){
storageDir.mkdir();
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
static final int REQUEST_TAKE_PHOTO = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
// Continue only if the File was successfully created
if (photoFile != null) {
try {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}catch(Exception e){
e.printStackTrace();
//galleryAddPic();
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidapp.natty.catalogcreate">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".CatalogDataActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-feature android:name="android.hardware.camera"
android:required="true" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.android.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</manifest>
file_paths.xml placed at res/xml/file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="com.androidapp.natty.catalogcreate/files/Pictures" />
</paths>
activity_catalog_data.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_catalog_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.androidapp.natty.catalogcreate.CatalogDataActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView" />
<Button
android:text="Open Camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_marginTop="10dp"
android:id="@+id/btn_camera"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:elevation="0dp" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="Product Name"
android:ems="10"
android:layout_below="@+id/btn_camera"
android:layout_marginTop="50dp"
android:id="@+id/et_productName"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:ems="10"
android:id="@+id/et_description"
android:text="Enter Description"
android:layout_below="@+id/et_productName"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/ic_menu_add"
android:layout_marginTop="28dp"
android:id="@+id/iv_image1"
android:layout_below="@+id/et_description" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/ic_menu_add"
android:layout_alignTop="@+id/iv_image1"
android:layout_toRightOf="@+id/textView"
android:layout_toEndOf="@+id/textView"
android:id="@+id/iv_image2" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/ic_menu_add"
android:layout_marginLeft="41dp"
android:layout_marginStart="41dp"
android:id="@+id/iv_image3"
android:layout_alignTop="@+id/iv_image2"
android:layout_toRightOf="@+id/iv_image2"
android:layout_toEndOf="@+id/iv_image2" />
<Button
android:text="Save Product"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_image2"
android:layout_marginTop="18dp"
android:id="@+id/btn_save"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_save"
android:layout_marginTop="56dp"
android:text="Hello World!"
android:id="@+id/tv_saved_text" />
</RelativeLayout>
> W/System.err: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.androidapp.natty.catalogcreate/files/Pictures/JPEG_20170222_233359_1077283085.jpg
W/System.err: at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
W/System.err: at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
W/System.err: at com.androidapp.natty.catalogcreate.CatalogDataActivity.dispatchTakePictureIntent(CatalogDataActivity.java:176)
W/System.err: at com.androidapp.natty.catalogcreate.CatalogDataActivity.access$000(CatalogDataActivity.java:33)
W/System.err: at com.androidapp.natty.catalogcreate.CatalogDataActivity$1.onClick(CatalogDataActivity.java:61)
W/System.err: at android.view.View.performClick(View.java:5612)
W/System.err: at android.view.View$PerformClick.run(View.java:22285)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6123)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
I/Choreographer: Skipped 2537 frames! The application may be doing too much work on its main thread.
I/art: Do full code cache collection, code=101KB, data=124KB
I/art: After code cache collection, code=64KB, data=67KB
You can not access the com.androidapp.natty.catalogcreate / files / Pictures directory in the root directory / storage / emulated / 0 /(external-path)
directly .You need to specify its full path, that is,' Android / data / com.androidapp.natty .catalogcreate / files / Pictures
'.
You can also use external-files-path (corresponding to /storage/emulated/0/com.androidapp.natty.catalogcreate/files/
directory), and then specify its Pictures directory.
code shown below:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.androidapp.natty.catalogcreate/files/Pictures" />
</paths>
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="" />
</paths>
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="Pictures" />
</paths>
–
–
<uses-feature android:name="android.hardware.camera"
android:required="true" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.android.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
code to application level in manifest file.
Please consider this if your are a beginner or little confusion about fileprovider configure
<files-path/> - internal app storage, Context#getFilesDir()
<cache-path/> - internal app cache storage, Context#getCacheDir()
<external-path/> - public external storage, Environment.getExternalStorageDirectory()
<external-files-path/> - external app storage, Context#getExternalFilesDir(null)
<external-cache-path/> - external app cache storage, Context#getExternalCacheDir()
Here is a case solution genuine or secure
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="/" />
</paths>
Environment.getExternalStorageDirectory()
returns path like this:
/storage/emulated/0
<external-path name="my_images" path="/" />
enough to access all file inside folder if you want some control on the folder you can change like this <external-path name="my_images" path="/b" />
.then you get only b folder, file and folder
public void getGROUPSTORAGEPremission(){
int hasWriteContactsPermission = Splash_activity.this.checkSelfPermission(Manifest.permission_group.STORAGE);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
Splash_activity.this.requestPermissions(new String[]{ Manifest.permission_group.STORAGE},
PERMISSION_GROUPSTORAGE);
} else {
//your code here
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_RECEIVESMS) {
if (grantResults[0] == PackageManager.PERMISSION_GROUPSTORAGE) {
//your code here
} else {
// Permission Denied
// Toast.makeText(mContext, "STORAGE Denied", Toast.LENGTH_SHORT)
// .show();
private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
public static final int MEDIA_TYPE_IMAGE = 1;
private Uri fileUri;
int isCamera = 1;
if (options[item].equals("Camera")) {
isCamera = 1;
if (checkandRequestPermission()) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
fileUri = FileProvider.getUriForFile(EditProfile.this, getPackageName()+ ".provider", getOutputMediaFile(MEDIA_TYPE_IMAGE));
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
} else {
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, 1);
} else if (options[item].equals("Choose from Gallery")) {
isCamera = 0;
if (checkandRequestPermission()) {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 2);
private boolean checkandRequestPermission() {
int camera = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
int storageread = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
int storagewrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
List<String> listpermissionNeeded = new ArrayList<>();
if (camera != PackageManager.PERMISSION_GRANTED) {
listpermissionNeeded.add(Manifest.permission.CAMERA);
if (storageread != PackageManager.PERMISSION_GRANTED) {
listpermissionNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
if (storagewrite != PackageManager.PERMISSION_GRANTED) {
listpermissionNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (!listpermissionNeeded.isEmpty()) {
ActivityCompat.requestPermissions(EditProfile.this, listpermissionNeeded.toArray(new String[listpermissionNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
return true;
and also add onRequestPermission result.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_ID_MULTIPLE_PERMISSIONS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// task you need to do.
if ((ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
&& (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
&& (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
if (isCamera == 1) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
fileUri = FileProvider.getUriForFile(EditProfile.this, getPackageName()+ ".provider", getOutputMediaFile(MEDIA_TYPE_IMAGE));
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
} else {
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, 1);
} else {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 2);
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
return;
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.