Android - 立即拍照 - onActivityResult returns

Android - take picture - onActivityResult returns immediately

我想在我的应用程序中拍照。当前片段在 TabHost 中。

在一个片段中,我开始相机动作:

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

当我的应用程序包含启动模式为 singleTask 或 singleTop 的 Activity 时,ActivityResult immediately returns with imageReturnedIntent 为 null。当我在我的应用程序中删除启动模式时,它会再次运行。

我该如何解决这个问题?

我在互联网上看到的是,启动的 activity(因此,在我的情况下是相机应用程序)不应具有启动模式 singleTop 或 singleTask。

问题:我自己的 Activity(具有启动模式 singleTop 或 singleTask)如何从相机应用程序获得 onActivityResult?

注意:在 Android 5.0+ 中可以正常工作。在Android 4.x 没有。

我希望有人能给出比这个从使用 'singleInstance' 或 'singleTop' 启动的 Activity 启动相机应用程序的蛮力答案更好的答案。所以,如果有人有更好的解决方案,我会删除这个答案。

您可以启动一个单独的 activity - 这将连接到相机应用程序。是的 - 我觉得设计这个解决方案有点惭愧。最后它起作用了。

好的,在您添加的清单文件中:

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

class 包含此代码 --- 不要忘记 finish():

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
    }
}

底线:必须有更好的解决方案。如果没有,这可能是您的逃生之道。

问题是:

A "singleInstance" activity, on the other hand, permits no other activities to be part of its task.

看这里 https://developer.android.com/guide/topics/manifest/activity-element.html#lmode

startActivityForResult 在同一任务中启动新的 activity。

因此,如果在单实例模式下为 activity 启动任务,则 Android 无法在任务中启动新的 activity。

您应该改用 singleTask 模式。与 singleInstance 非常相似,但允许在任务上启动其他活动。

在 android >=5.0 上 singleInstance 模式你会遇到另一个问题: 你总是 resultCode == Activity.RESULT_CANCELED.