在我的应用程序中,我想拍照。当前片段在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中没有。
答案 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
。