Android - 拍照 - onActivityResult 立即返回

3
在我的应用程序中,我想拍照。当前的片段位于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

当我的应用包含一个具有launchmode singleTask或singleTop的Activity时,onActivityResult会立即返回imageReturnedIntent为null。当我从应用中删除launchmode时,它就可以正常工作了。
我该如何解决这个问题?
我在网上看到的是,被启动的Activity(例如相机应用程序)不应该有launchmode singleTop或singleTask。
问题:我的Activity(具有launchmode singleTop或singleTask)如何从相机应用程序获取onActivityResult?
注意:在Android 5.0+中,这个问题很好解决。但在Android 4.x上无法正常工作。
2个回答

1
问题是:
另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。
请看这里https://developer.android.com/guide/topics/manifest/activity-element.html#lmode 而且,startActivityForResult在同一个任务中启动新的活动。
因此,如果为单个实例模式下的活动启动了任务,则Android无法在该任务中启动新的活动。
您应该使用“singleTask”模式。它很像“singleInstance”,但允许在任务上启动其他活动。
在android >=5.0上,您将遇到单个实例模式的另一个问题:始终具有resultCode == Activity.RESULT_CANCELED。

谢谢,这提供了深入的见解。 - tm1701

0

我真的希望有人能给出比这种暴力启动相机应用程序更好的答案,特别是在使用“singleInstance”或“singleTop”启动的Activity中。因此,如果有人有更好的解决方案,我会删除这个答案。

您可以启动一个独立的活动-它将进行与相机应用程序的接口。是的-我感到有点羞愧地设计了这个解决方案。最终它有效了。

好的,在清单文件中添加以下内容:

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

该类包含以下代码 --- 别忘了调用 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
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接