2015-09-30 5 views
3

В моем приложении я хотел бы сфотографироваться. Текущий фрагмент находится внутри TabHost.Android - снимок - onActivityResult немедленно возвращается

В фрагменте я начинаю действие камеры с:

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
getActivity().startActivityForResult(takePicture, 1); 

В моей MainActivity я имею onActivityResult:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
     super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
     if(imageReturnedIntent == null) { 
      // immediately coming here when my OWN app is singleTop or singleTask 

Когда мой App содержит активность с launchmode singleTask или SingleTop, то onActivityResult сразу возвращается с изображением. Возвращаемое значение равно null. Когда я удаляю запуск в моем приложении, он снова работает.

Как это исправить?

То, что я читал в Интернете, это то, что запущенная деятельность (так, в моем случае приложение для камеры) не должна иметь singlemop или singleTask для запуска.

Вопрос: как моя собственная деятельность (с одним стартовым моментом или однократной загрузкой) получает onActivityResult из приложения для камеры?

Примечание: в Android 5.0+ это работает нормально. В Android 4.x нет.

ответ

0

Я надеюсь, что кто-то даст лучший ответ, чем этот ответ грубой силы, чтобы запустить приложение «Камера» из вашей деятельности, которое запускается с помощью «singleInstance» или «singleTop». Поэтому я удалю этот ответ, если у кого-то будет лучшее решение.

Вы можете начать отдельную деятельность, которая будет взаимодействовать с приложением камеры. Да, я чувствую себя немного стыдно за разработку этого решения. В конце концов это работает.

ОК, в файле манифеста добавить:

<activity 
    android:name = "StartMedia" 
    android:label = "StarterMedia" 
    android:theme = "@android:style/Theme.NoDisplay" /> 

Класс содержит этот код --- и не забудьте отделку():

public class StartMedia extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent takePciture= new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(takePciture, 2); 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
     if(imageReturnedIntent == null) { 
      Logger.v("intent is null - action ... "); 
      return ; 
     } 
     switch(requestCode) { 
     case 1: 
     case 2: 
      Uri selectedImage = imageReturnedIntent.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA}; 
      Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String fileName = cursor.getString(columnIndex); 
      Logger.v("Your Path:" + fileName); 
      // DO something with the result 
      cursor.close(); 
      break; 
     } 
     finish(); // important - otherwise it hangs your app 
    } 
} 

Итог: там должен быть лучшим решением для этого. Если нет, это может быть ваш побег.

0

Проблема заключается в том:

активность «SingleInstance» А, с другой стороны, не допускает никаких других деятельность, чтобы быть частью своей задачи.

посмотреть здесь https://developer.android.com/guide/topics/manifest/activity-element.html#lmode

и startActivityForResult запускает новую деятельность в одной и той же задачи.

Итак, если задача запускается в режиме SingleInstance, то Android не может запустить новую активность в задаче.

Вместо этого вы должны использовать режим singleTask. Это очень похоже на singleInstance, но позволяет запускать другие действия над задачей.

on android> = 5.0 у вас будет другая проблема с singleInstance режиме: у вас всегда есть resultCode == Activity.RESULT_CANCELED.

+0

Спасибо, это дает понимание. – tjm1706

Смежные вопросы