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