#android #android-intent #android-camera2
#Android #android-намерение #android-camera2
Вопрос:
Я внедряю функциональность для получения изображения из приложения камеры и сохранения его в хранилище приложений. Это действие «NewWordActivity» обрабатывает сбор записей для добавления в базу данных комнат.
Приложение выходит из строя при попытке создать URI для передачи в назначение камеры (выделено ниже в методе «TakePictureIntent»). Я неправильно реализую намерение? Спасибо!
public class NewWordActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
public static final String WORD_REPLY = "com.example.android.wordlistsql.WORD";
public static final String CAT_REPLY = "com.example.android.wordlistsql.CAT";
public static final String PIC_REPLY = "com.example.android.wordlistsql.PIC";
static final int REQUEST_IMAGE_CAPTURE = 2;
//DIR for Pictures
//final String picsDIR = getDir("Pictures", 0).toString();
private EditText mEditWordView;
String wordCategory;
String wordPhotoDIR;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_word);
mEditWordView = findViewById(R.id.edit_word);
//Category Spinner
Spinner categories = findViewById(R.id.category_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.word_categories, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
categories.setAdapter(adapter);
categories.setOnItemSelectedListener(this);
//Choose Image Button
final Button choosePicButton = findViewById(R.id.button_getPic);
choosePicButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
TakePictureIntent();
//finish();
}
});
//Save Button
final Button saveButton = findViewById(R.id.button_save);
saveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent replyIntent = new Intent();
if (TextUtils.isEmpty(mEditWordView.getText())) {
setResult(RESULT_CANCELED, replyIntent);
} else {
String word = mEditWordView.getText().toString();
replyIntent.putExtra(WORD_REPLY, word);
replyIntent.putExtra(CAT_REPLY, wordCategory);
setResult(RESULT_OK, replyIntent);
}
finish();
}
});
}
//Methods for Category Spinner
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
wordCategory = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
Это метод, при котором происходит сбой.
//Methods for Picture Selector
private void TakePictureIntent(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //MediaStore.ACTION_IMAGE_CAPTURE
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
Toast.makeText(
getApplicationContext(),
R.string.error_photo_file,
Toast.LENGTH_LONG).show();
}
// Continue only if the File was successfully created
if (photoFile != null) {
/*App Crashes Here*/
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
/*.................*/
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
Это метод onActivityResult для намерения камеры. Приложение никогда не достигает цели камеры, чтобы сделать это здесь.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//Preview Image
ImageView picPreview = findViewById(R.id.picPreview);
if (requestCode == REQUEST_IMAGE_CAPTURE amp;amp; resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
picPreview.setImageBitmap(imageBitmap);
}
}
Это обрабатывает создание объекта file, на который ссылается URI.
private File createImageFile() throws IOException{
//Create Name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "word_" timeStamp;
File storageDIR = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, //Prefix
".jpg", //Suffix
storageDIR //Directory
);
//Save file and path
wordPhotoDIR = image.getAbsolutePath();
return image;
}
Вот ошибка:
——— начало сбоя E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.android.roomwordssample, PID: 4728 java.lang.Исключение IllegalArgumentException: не удалось найти настроенный root, содержащий /storage/emulated/0/Android/data/com.example.android.roomwordssample/files/Pictures/word_20190321_1250344218377806003302351.jpg в Android.support.v4.content.Файлообменник $SimplePathStrategy.getUriForFile(FileProvider.java:712) на android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401) в com.example.android.roomwordssample.NewWordActivity.Возьмите pictureintent(NewWordActivity.java:135) в com.example.android.roomwordssample.NewWordActivity.получите доступ к $ 000 (NewWordActivity.java:46) в com.example.android.roomwordssample.NewWordActivity $ 1.onClick (NewWordActivity.java: 79) на android.view.View.performClick (View.java: 6294) на android.view.View$performClick.run(View.java: 24770) на android.os.Handler.handleCallback(Обработчик.java: 790) на android.os.Handler.DispatchMessage (Обработчик.java: 99) на android.os.Looper.loop(петлитель. java: 164) на Android.app.ActivityThread.main (ActivityThread.java:6494) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Комментарии:
1. опубликуйте свою ошибку
2. Я обновил сообщение с ошибкой. Спасибо!
3. Есть ли у вас поставщик файлов в вашем манифесте? Настроены ли пути для него? Действительно ли это называется «com.example.android.fileprovider» для его полномочий?
4. Вот поставщик в манифесте: <поставщик android:name=»android.support.v4.content. Файлообладатель» android:authorities=»com.example.android.fileprovider» android:exported=»false» android:grantUriPermissions=»true»> <метаданные android: name=»android.support. FILE_PROVIDER_PATHS» android:ресурс=»@xml/file_paths»></метаданные> </поставщик>
5. @JohnJoe ваша ссылка была очень полезной, спасибо! Приложение позволяет мне войти в камеру сейчас, но сбой в «onActivityResult» в следующей строке: Bitmap ImageBitmap = (Bitmap) extras.get(«данные»);