setContent() 用于完成 Activity 不工作 API 16
setContent() for finishing an Activity not working on API 16
我正在构建一个应用程序,我需要从图库中 select 图片或通过相机拍摄新图片。我构建了三个活动:一个 activity 显示 selected/taken 图片,一个 select 内存中的图片作为画廊,一个用相机拍摄新照片。我所做的是:当用户单击按钮以获取更多图片时,我会打开一个意图选择器,如下所示:
Intent galleryIntent = new Intent(Constants.INTENT_GALLERY);
Intent cameraIntent = new Intent(Constants.INTENT_PHOTO_CAPTURE);
Intent chooserIntent
= Intent.createChooser(galleryIntent, getString(R.string.title_photo_chooser));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { cameraIntent });
startActivityForResult(chooserIntent, Constants.SUCCESS);
然后画廊和相机activity像这样完成:
Intent intent = new Intent();
intent.putStringArrayListExtra(Constants.INTENT_KEY_PHOTO, selected);
setResult(RESULT_OK, intent);
finish();
最后,第一个 activity 查看者得到这样的结果:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == RESULT_OK){
if( requestCode == Constants.SUCCESS ) {
[...]
}
}
}
这已在我的 API 22 手机上被证明是成功的。不幸的是,当 运行 在我的 API 16 平板电脑上时,在 onActivityResult()
,resultCode
永远不会 RESULT_OK
,并且 intent
总是 null。我见过许多解决方案,例如调用 getParent().setResult()
,但似乎没有任何效果。
任何提示都会有用。谢谢。
编辑
我已经用调试器分析了两个版本中 activity 的内容。这些状态是我的 Gallery
activity 在调用 finish()
之前的状态。在 API 22,我有这个:
mParent = null
mResultCode = -1
mResultData = {Intent@5081} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mContentUserHint = -2
mData = null
mExtras = {Bundle@5134} "Bundle[{photo=[/storage/emulated/0/DCIM/Camera/....jpg, ...]}]"
mFlags = 0
mLaunchParams = {DualScreenLaunchParams@5135} "DualScreenLaunchParams { mScreen=UNKNOWN mFlags=0 }"
mMultiWindowStyle = null
mPackage = null
mSelector = null
mSourceBounds = null
mType = null
mWindowMode = 0
mWindowPosition = null
mWindowScale = 0.0
shadow$_klass_ = {Class@1261} "class android.content.Intent"
shadow$_monitor_ = -1875875432
在 API 16,我有这个:
mParent = null
mResultCode = -1
mResultData = {Intent@830041848224} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mData = null
mExtras = {Bundle@830042231640} "Bundle[{photo=[/storage/sdcard0/Pictures/....jpeg, ...]}]"
mType = null
mPackage = null
mSelector = null
mSourceBounds = null
mFlags = 0
有差异,但似乎 setContent()
完成了它的工作。
确保 setResult
没有在 finish()
之前被调用
终于找到问题了。关键在 doc 中 startActivityForResult
。它指出:
For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.
我确实使用 singleTask
作为启动模式。我切换到 singleTop
并且它起作用了。我正在研究启动模式以使一切正常。
我正在构建一个应用程序,我需要从图库中 select 图片或通过相机拍摄新图片。我构建了三个活动:一个 activity 显示 selected/taken 图片,一个 select 内存中的图片作为画廊,一个用相机拍摄新照片。我所做的是:当用户单击按钮以获取更多图片时,我会打开一个意图选择器,如下所示:
Intent galleryIntent = new Intent(Constants.INTENT_GALLERY);
Intent cameraIntent = new Intent(Constants.INTENT_PHOTO_CAPTURE);
Intent chooserIntent
= Intent.createChooser(galleryIntent, getString(R.string.title_photo_chooser));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { cameraIntent });
startActivityForResult(chooserIntent, Constants.SUCCESS);
然后画廊和相机activity像这样完成:
Intent intent = new Intent();
intent.putStringArrayListExtra(Constants.INTENT_KEY_PHOTO, selected);
setResult(RESULT_OK, intent);
finish();
最后,第一个 activity 查看者得到这样的结果:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == RESULT_OK){
if( requestCode == Constants.SUCCESS ) {
[...]
}
}
}
这已在我的 API 22 手机上被证明是成功的。不幸的是,当 运行 在我的 API 16 平板电脑上时,在 onActivityResult()
,resultCode
永远不会 RESULT_OK
,并且 intent
总是 null。我见过许多解决方案,例如调用 getParent().setResult()
,但似乎没有任何效果。
任何提示都会有用。谢谢。
编辑
我已经用调试器分析了两个版本中 activity 的内容。这些状态是我的 Gallery
activity 在调用 finish()
之前的状态。在 API 22,我有这个:
mParent = null
mResultCode = -1
mResultData = {Intent@5081} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mContentUserHint = -2
mData = null
mExtras = {Bundle@5134} "Bundle[{photo=[/storage/emulated/0/DCIM/Camera/....jpg, ...]}]"
mFlags = 0
mLaunchParams = {DualScreenLaunchParams@5135} "DualScreenLaunchParams { mScreen=UNKNOWN mFlags=0 }"
mMultiWindowStyle = null
mPackage = null
mSelector = null
mSourceBounds = null
mType = null
mWindowMode = 0
mWindowPosition = null
mWindowScale = 0.0
shadow$_klass_ = {Class@1261} "class android.content.Intent"
shadow$_monitor_ = -1875875432
在 API 16,我有这个:
mParent = null
mResultCode = -1
mResultData = {Intent@830041848224} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mData = null
mExtras = {Bundle@830042231640} "Bundle[{photo=[/storage/sdcard0/Pictures/....jpeg, ...]}]"
mType = null
mPackage = null
mSelector = null
mSourceBounds = null
mFlags = 0
有差异,但似乎 setContent()
完成了它的工作。
确保 setResult
没有在 finish()
终于找到问题了。关键在 doc 中 startActivityForResult
。它指出:
For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.
我确实使用 singleTask
作为启动模式。我切换到 singleTop
并且它起作用了。我正在研究启动模式以使一切正常。