lmthrn
lmthrn

Reputation: 11

Code failing when trying to save an image to the external storage

I'm trying to save an image that was taken through invoking the camera intent to my external storage, however, the app crashes after asking for the camera permissions

Test.java

    public void dispatchTakePictureIntent(View view) {
        if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            invokeCamera();
        } else {
            String [] permissionRequest = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
            requestPermissions(permissionRequest, CAMERA_PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                invokeCamera();
            } else{
                Toast.makeText(this, "Cannot use camera without permission", Toast.LENGTH_LONG).show();
            }
        }
    }

    private void invokeCamera() {
        Uri pictureUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", createImageFile());

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
        takePictureIntent.addFlags(takePictureIntent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
    }

    private File createImageFile() {
        File picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String timeStamp = sdf.format(new Date());

        File imageFile = new File(picturesDirectory, "picture" + timeStamp +".jpg");
        return imageFile;
    }

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />

<provider
            android:authorities="lmathurin.raptor.provider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
        </provider>

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="+"/>

</paths>

I followed this tutorial when writing out the code: https://www.youtube.com/watch?v=jstmSgAK3Fo

I believe the code is failing in the invokeCamera() method as the app asks for camera permissions and then crashes

Here's the stacktrace:

05-05 18:23:02.099 7844-7844/lmathurin.raptor E/AndroidRuntime: FATAL EXCEPTION: main
                                                                Process: lmathurin.raptor, PID: 7844
                                                                java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                    at android.view.View.performClick(View.java:6294)
                                                                    at android.view.View$PerformClick.run(View.java:24770)
                                                                    at android.os.Handler.handleCallback(Handler.java:790)
                                                                    at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                    at android.os.Looper.loop(Looper.java:164)
                                                                    at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                                                                 Caused by: java.lang.reflect.InvocationTargetException
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                    at android.view.View.performClick(View.java:6294) 
                                                                    at android.view.View$PerformClick.run(View.java:24770) 
                                                                    at android.os.Handler.handleCallback(Handler.java:790) 
                                                                    at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                    at android.os.Looper.loop(Looper.java:164) 
                                                                    at android.app.ActivityThread.main(ActivityThread.java:6494) 
                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
                                                                 Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/picture20180505_182302.jpg
                                                                    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712)
                                                                    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401)
                                                                    at lmathurin.raptor.Test.invokeCamera(Test.java:85)
                                                                    at lmathurin.raptor.Test.dispatchTakePictureIntent(Test.java:65)
                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                    at android.view.View.performClick(View.java:6294) 
                                                                    at android.view.View$PerformClick.run(View.java:24770) 
                                                                    at android.os.Handler.handleCallback(Handler.java:790) 
                                                                    at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                    at android.os.Looper.loop(Looper.java:164) 
                                                                    at android.app.ActivityThread.main(ActivityThread.java:6494) 
                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

Upvotes: 0

Views: 107

Answers (1)

Suleyman
Suleyman

Reputation: 2943

In your file_paths.xml instead of + put ., it basically means that it's a current directory.

Upvotes: 1

Related Questions