-1

I try the tutorial from Youtube to make Text Recognition from Camera, but somehow the app force close

Logcat

2021-01-14 17:10:49.411 26731-26731/? E/le.masunprojec: Unknown bits set in runtime_flags: 0x28000 <br/>
2021-01-14 17:10:49.497 26731-26760/com.example.masunproject E/Perf: Fail to get file list com.example.masunproject <br/>
2021-01-14 17:10:49.498 26731-26760/com.example.masunproject E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array <br/>
2021-01-14 17:10:49.498 26731-26760/com.example.masunproject E/Perf: Fail to get file list com.example.masunproject <br/>
2021-01-14 17:10:49.498 26731-26760/com.example.masunproject E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array <br/>
2021-01-14 17:10:49.498 26731-26760/com.example.masunproject E/Perf: Fail to get file list oat <br/>
2021-01-14 17:10:49.498 26731-26760/com.example.masunproject E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array <br/>
2021-01-14 17:10:57.315 26731-26731/com.example.masunproject E/AndroidRuntime: FATAL EXCEPTION: main <br/>
    Process: com.example.masunproject, PID: 26731 <br/>
    java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=android/com.android.internal.app.ResolverActivity clip={text/uri-list U:content://media/external/images/media/476840} (has extras) } from ProcessRecord{2689c68 26731:com.example.masunproject/u0a421} (pid=26731, uid=10421) with revoked permission android.permission.CAMERA <br/>
        at android.os.Parcel.createException(Parcel.java:2087)<br/>
        at android.os.Parcel.readException(Parcel.java:2055)<br/>
        at android.os.Parcel.readException(Parcel.java:2003)<br/>
        at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3872)<br/>
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1714)<br/>
        at android.app.Activity.startActivityForResult(Activity.java:5319)<br/>
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)<br/>
        at android.app.Activity.startActivityForResult(Activity.java:5263)<br/>
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)<br/>
        at com.example.masunproject.MainActivity.add(MainActivity.java:74)<br/>
        at com.example.masunproject.MainActivity.access$000(MainActivity.java:25)<br/>
        at com.example.masunproject.MainActivity$3.onClick(MainActivity.java:61)<br/>
        at android.view.View.performClick(View.java:7256)<br/>
        at android.view.View.performClickInternal(View.java:7218)<br/>
        at android.view.View.access$3800(View.java:824)<br/>
        at android.view.View$PerformClick.run(View.java:27719)<br/>
        at android.os.Handler.handleCallback(Handler.java:883)<br/>
        at android.os.Handler.dispatchMessage(Handler.java:100)<br/>
        at android.os.Looper.loop(Looper.java:228)<br/>
        at android.app.ActivityThread.main(ActivityThread.java:7782)<br/>
        at java.lang.reflect.Method.invoke(Native Method)<br/>
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)<br/>
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)<br/>
     Caused by: android.os.RemoteException: Remote stack trace: <br/>
        at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1155)<br/>
        at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:979)<br/>
        at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:636)<br/>
        at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1803)<br/>
        at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:567)<br/>

MainActivity

public class MainActivity extends AppCompatActivity {<br/>
    ImageView imageView,speak,capture;<br/>
    EditText editText;<br/>
    String s;<br/>
    TextToSpeech textToSpeech;<br/>
    Uri uri;<br/>
    private static final int IMAGE_PICK_CAMERA_CODE=1001;<br/>
    @Override<br/>
    protected void onCreate(Bundle savedInstanceState) {<br/>
        super.onCreate(savedInstanceState);<br/>
        setContentView(R.layout.activity_main);<br/>
        editText = findViewById(R.id.editView);<br/>



        textToSpeech=new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {

            }
        });

        speak=findViewById(R.id.speak);
        capture=findViewById(R.id.capture);
        imageView=findViewById(R.id.imageView);

        speak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textToSpeech.speak(s,TextToSpeech.QUEUE_FLUSH,null);

            }
        });

        capture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                add();
            }
        });

    }

    private void add() {
        ContentValues values=new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "Picture");
        values.put(MediaStore.Images.Media.DESCRIPTION, "Camera to speak");
        uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        Intent c=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        c.putExtra(MediaStore.EXTRA_OUTPUT,uri);
        startActivityForResult(c, IMAGE_PICK_CAMERA_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        capture.setVisibility(View.GONE);
        speak.setVisibility(View.VISIBLE);

        if(requestCode==IMAGE_PICK_CAMERA_CODE){
            CropImage.activity(uri)
                    .setGuidelines(CropImageView.Guidelines.ON)
                    .start(this);
        }
        CropImage.ActivityResult result= CropImage.getActivityResult(data);
        Uri uri=result.getUri();
        imageView.setImageURI(uri);

        BitmapDrawable bitmapDrawable=(BitmapDrawable) imageView.getDrawable();
        Bitmap bitmap=bitmapDrawable.getBitmap();

        TextRecognizer recognizer=new TextRecognizer.Builder(getApplicationContext()).build();
        Frame frame=new Frame.Builder().setBitmap(bitmap).build();
        SparseArray<TextBlock> item=recognizer.detect(frame);
        StringBuilder stringBuilder=new StringBuilder();

        for(int i=0;i<item.size();i++){
            TextBlock myitem=item.valueAt(i);
            stringBuilder.append(myitem.getValue());
            stringBuilder.append("\n");
        }

        editText.setText(stringBuilder.toString());
        s=stringBuilder.toString();

        super.onActivityResult(requestCode, resultCode, data);
    }
}

Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.masunproject">

    <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
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
            android:theme="@style/AppTheme"/>
    </application>

</manifest>


Ichigo Kurosaki
  • 3,765
  • 8
  • 41
  • 56
Lyn Lau
  • 1
  • 1
  • 1
    Need to add runtime permission to access sensitive content, refer https://stackoverflow.com/a/33162451/3159267 – Rajan Kali Jan 14 '21 at 11:20
  • Same opinion than Lyn Lau. But, as a comment from your first post, please, try to do a deeper analyse before posting directly your logs. For me (IMHO) this is really aggressive. NOTE: The relevan line is: java.lang.SecurityException: Permission Denial: starting Intent – Sourcerer Jan 14 '21 at 11:22

1 Answers1

0

You can change the add method to catch any exceptions and that will prevent you from closing the app prematurely.

if you amend the onClick that calls add() You can change it to:

capture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(CheckRunTimePermissions(view.getContext(),Manifest.permission.CAMERA)){
                add();
                return;
            }
            requestPermissions(view.getContext(), new String[] { Manifest.permission.CAMERA}, 100);
        }
    });

You will also need to implement the permission call back.

Callback

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    switch (requestCode) {
        case 100:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                add();
            }  else {
                //show rationale
            }
            return;
    }
}

Helper method to check if you have the right permission.

public Boolean CheckRunTimePermissions(Context mContext, String permission){
    return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED;
}

And finally your add() method

private void add() {
        ContentValues values=new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "Picture");
        values.put(MediaStore.Images.Media.DESCRIPTION, "Camera to speak");
        uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        Intent c=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        c.putExtra(MediaStore.EXTRA_OUTPUT,uri);
        try{
            startActivityForResult(c, IMAGE_PICK_CAMERA_CODE);
        }catch(Exception e){
            //will stop you force closing
            Log.d(this.getClass().getSimpleName(), "Error :" + e.getMessage());
        }
}
Scott Johnson
  • 707
  • 5
  • 13