Приложение возвращается к неправильной активности после выхода из режима камеры

#android #android-intent #android-camera2

#Android #android-намерение #android-camera2

Вопрос:

Я пытаюсь написать приложение, которое, в частности, создает базу данных изображений, упорядоченных по категориям. У меня возникли проблемы с использованием intent для доступа к камере. Я могу войти в камеру и сделать снимок, но приложение возвращается к неправильному действию. (MainActivity вместо newWord Activity). Я создаю это на основе примера проекта Google «Комната с видом», если это уместно. Заранее спасибо!

 public class MainActivity extends AppCompatActivity {

public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;

private WordViewModel mWordViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setHasFixedSize(true); //Line to improve performance

    final WordListAdapter adapter = new WordListAdapter(this);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new GridLayoutManager(this,4)); //Changed this

    // Get a new or existing ViewModel from the ViewModelProvider.
    mWordViewModel = ViewModelProviders.of(this).get(WordViewModel.class);

    //Unload Intent to get Category
    String chosenCat = getIntent().getExtras().getString("CAT_KEY");

    //File DIR
    final String DIR = getFilesDir().toString();
   // final String DIR  = Environment.getExternalStoragePublicDirectory(
     //       Environment.DIRECTORY_PICTURES).toString();
    //final String picsDIR = getDir("Pictures", 0).toString();

    //Check what category and load

    // The onChanged() method fires when the observed data changes and the activity is
    // in the foreground.
    if(chosenCat.equals("BASIC")) {
        mWordViewModel.getBasicCatWords().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(@Nullable final List<Word> words) {
                // Update the cached copy of the words in the adapter.
                adapter.setWords(words);
                Toast.makeText(
                        getApplicationContext(),
                        "Category 1",
                        Toast.LENGTH_LONG).show();
            }
        });
    } //If Basic
    else if(chosenCat.equals("ALL")) {
        mWordViewModel.getAllWords().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(@Nullable final List<Word> words) {
                // Update the cached copy of the words in the adapter.
                adapter.setWords(words);
                Toast.makeText(
                        getApplicationContext(),
                        DIR,
                        Toast.LENGTH_LONG).show();
            }
        });
    } //Else if all
    else if(chosenCat.equals("PLAY")) {
        mWordViewModel.getPlayCatWords().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(@Nullable final List<Word> words) {
                // Update the cached copy of the words in the adapter.
                adapter.setWords(words);
                Toast.makeText(
                        getApplicationContext(),
                        "Category 2",
                        Toast.LENGTH_LONG).show();
            }
        });
    } //Else if play

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, NewWordActivity.class);
            startActivityForResult(intent, NEW_WORD_ACTIVITY_REQUEST_CODE);
        }
    });
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == NEW_WORD_ACTIVITY_REQUEST_CODE amp;amp; resultCode == RESULT_OK) {
        //Word word = new Word(data.getStringExtra(NewWordActivity.WORD_REPLY));
        Word word = new Word(data.getStringExtra(NewWordActivity.WORD_REPLY),data.getStringExtra(NewWordActivity.CAT_REPLY));
        mWordViewModel.insert(word);
    } else {
        Toast.makeText(
                getApplicationContext(),
                R.string.empty_not_saved,
                Toast.LENGTH_LONG).show();
    }
}
  

}

Основное действие (выше) использует намерение перейти в NewWordActivity. (При нажатии плавающей кнопки действия) Затем для входа в камеру используется дополнительное намерение при нажатии кнопки «Сделать снимок» в NewWordActivity (ниже).

    /**
   * Activity for entering a word.
   */

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;

@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) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    Toast.makeText(
            getApplicationContext(),
            "I made it to result",
            Toast.LENGTH_LONG).show();
    //Preview Image
    ImageView picPreview = (ImageView)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);
    }
}
  

}

Ответ №1:

Удалить finish(); в choosePicButton по щелчку. Это будет выглядеть следующим образом

 choosePicButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            TakePictureIntent();
        }
});
  

Комментарии:

1. Это сделало это! Спасибо!

2. Рад помочь, пожалуйста, примите мой ответ, если это решит вашу проблему, спасибо