Android - 拍照 - onActivityResult立即返回

时间:2015-09-30 09:37:50

标签: android android-intent android-camera-intent

在我的应用程序中,我想拍照。当前片段在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时,它再次工作。

我该如何解决这个问题?

我在互联网上看到的是,启动的活动(在我的情况下是Camera App)不应该有launchmode singleTop或singleTask。

问题:我自己的Activity(拥有launchmode singleTop或singleTask)如何从Camera App获得onActivityResult?

注意:在Android 5.0+中,这很好用。在Android 4.x中没有。

2 个答案:

答案 0 :(得分: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
    }
}

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

答案 1 :(得分:0)

问题是:

  

另一方面,“singleInstance”活动不允许其他活动   活动是其任务的一部分。

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

并且startActivityForResult在同一任务中启动新活动。

因此,如果在singleInstance模式下为活动启动任务,则Android无法在任务中启动新活动。

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

在android&gt; = 5.0上,您将遇到singleInstance模式的另一个问题: 你总是有resultCode == Activity.RESULT_CANCELED