片段中的Android选择器意图到图片照片
Posted
技术标签:
【中文标题】片段中的Android选择器意图到图片照片【英文标题】:Android Chooser intent in fragment to pic photo 【发布时间】:2015-10-30 18:25:24 【问题描述】:我遇到了以下问题,
我的项目有以下结构,
有一个父activity,里面会承载fragments(共3个),布局如下图,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<FrameLayout
android:id="@+id/processContent"
android:layout_
android:layout_
android:layout_above="@+id/detSaveNContBtn" />
</RelativeLayout>
在活动启动时,第一个fragment会被加载,即framelayout(processContent)会被fragment1替换,Fragment1有一个按钮,点击那个按钮,processContent会被Fragment2替换,同理Fragment3 的加载方式。
在 Fragment3 中,我必须上传多张照片,这些照片可以是用相机拍摄的,也可以是来自图库的。
所以我使用选择器意图来显示选择,相同的代码如下所示,
final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
root.mkdirs();
final String fname = "img_" + System.currentTimeMillis();
final File sdImageMainDirectory = new File(root, fname);
outputFileUri = Uri.fromFile(sdImageMainDirectory);
// Camera.
SignUpProccessActivity activity = (SignUpProccessActivity) getActivity();
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = activity.getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
Uri fileUri = Uri.fromFile(sdImageMainDirectory);
activity.setCapturedImageURI(fileUri);
activity.setCurrentPhotoPath(fileUri.getPath());
for(ResolveInfo res : listCam)
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, activity.getCapturedImageURI());
cameraIntents.add(intent);
// Filesystem.
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
startActivityForResult(chooserIntent, 1888);
当我从图库中选择照片时,一切都很好,但是当我尝试从相机中获取图像时,活动的 oncreate 被调用,因此将再次显示 Fragment1。
我知道 oncreate 会在调用相机时被调用,因为方向从this 问题中发生变化,正如我添加属性的问题中所回答的那样,
android:configChanges="orientation|screenSize"
android:screenOrientation="portrait"
但还是同样的问题。
我在这方面做错了什么。
对此的任何帮助将不胜感激。
更新:我通过从选择器中删除图库进行了检查,即仅在单击按钮后调用相机意图,如果只有相机在那里,则片段的 onActivityResult
被调用。
【问题讨论】:
您应该保存活动状态并在调用 onCreate 时再次恢复,而不是强制定向。见developer.android.com/training/basics/activity-lifecycle/… @adelphus:我已根据您的评论更改了代码。但仍然是相同的行为 【参考方案1】:您观察到的问题是由于某些手机的相机应用程序强制更改屏幕方向(并将您的应用程序作为副作用破坏 - 最好的是三星,它可以一次强制旋转几次) .我了解到缓解它的唯一方法是将活动(或片段)实例状态保存在onSaveInstanceState()
另一个可能的原因是在活动中膨胀片段时,您没有检查savedInstanceState
是否不为空。如果不这样做,你会膨胀新的片段(替换旧的片段)。结果是,片段的onActivityResult()
永远不会被调用。 (但请注意,不支持嵌套片段)。
【讨论】:
非常感谢您的回答,它对我来说非常有效。你这个摇滚男!!以上是关于片段中的Android选择器意图到图片照片的主要内容,如果未能解决你的问题,请参考以下文章
从android中的意图选择器中选择选项(相机或画廊)后请求权限