Я пытаюсь связать свое приложение со службами Watson, и вот код. сборка работает нормально, но всякий раз, когда я снимаю на камеру, приложение вылетает, и я получаю эту ошибку в logcat
2019-05-13 03: 21: 54.337 6672-6911 / com.example.sensistan E / AndroidRuntime: FATAL EXCEPTION: AsyncTask # 1 Процесс: com.example.sensistan, PID: 6672
Я также новичок в преобразовании URI изображения в файл, и я думаю, что это может быть проблемой. Тем не менее, я не мог найти жизнеспособное решение для того же.
package com.example.sensistan;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.ibm.watson.developer_cloud.visual_recognition.v3.VisualRecognition;
import com.ibm.watson.developer_cloud.visual_recognition.v3.model.ClassifiedImages;
import com.ibm.watson.developer_cloud.visual_recognition.v3.model.ClassifyOptions;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Arrays;
public class aiMode extends AppCompatActivity {
Button mcpt;
VisualRecognition mVisualRecognition;
ImageView mimg;
Uri image_uri;
private static final int PERMISSION_CODE=1000;
private static final int IMAGE_CAPTURE_CODE=1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ai_mode);
mVisualRecognition = new VisualRecognition("2018-03-19");
mVisualRecognition.setApiKey("RWVt-UwFpp9yPPWGMsgZ3jZM2G1ik5xWtPFDHbk056R2");
mimg = findViewById(R.id.imgv);
mcpt = findViewById(R.id.capture);
mcpt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
if(checkSelfPermission(Manifest.permission.CAMERA)==
PackageManager.PERMISSION_DENIED ||checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
PackageManager.PERMISSION_DENIED){
String[] permission = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permission, PERMISSION_CODE);
}
else{
openCamera();
}
}
else{
openCamera();
}
}
});
}
private void openCamera(){
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "New Picture");
values.put(MediaStore.Images.Media.DESCRIPTION, "From the Camera");
image_uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
startActivityForResult(cameraIntent,IMAGE_CAPTURE_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch(requestCode){
case PERMISSION_CODE:{
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
openCamera();
}
else{
Toast.makeText(this, "Permission Denied...", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
mimg.setImageURI(image_uri);
final File photoFile = new File(image_uri.getPath());
AsyncTask.execute(new Runnable() {
@Override
public void run() {
InputStream imagesStream = null;
try {
imagesStream = new FileInputStream(photoFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ClassifyOptions classifyOptions = new ClassifyOptions.Builder()
.imagesFile(imagesStream)
.imagesFilename(photoFile.getName())
.threshold((float) 0.6)
.owners(Arrays.asList("me"))
.build();
ClassifiedImages result = mVisualRecognition.classify(classifyOptions).execute();
Gson gson = new Gson();
String json = gson.toJson(result);
String name = null;
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonArray = jsonObject.getJSONArray("images");
JSONObject jsonObject1 = jsonArray.getJSONObject(0);
JSONArray jsonArray1 = jsonObject1.getJSONArray("classifiers");
JSONObject jsonObject2 = jsonArray1.getJSONObject(0);
JSONArray jsonArray2 = jsonObject2.getJSONArray("classes");
JSONObject jsonObject3 = jsonArray2.getJSONObject(0);
name = jsonObject3.getString("class");
} catch (JSONException e) {
e.printStackTrace();
}
final String finalName = name;
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView aitxtrtn = findViewById(R.id.aiTextrtn);
aitxtrtn.setText(finalName);
}
});
}
});
}
}
}