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>