片段中的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中的意图选择器中选择选项(相机或画廊)后请求权限

在标签片段android中添加谷歌地点选择器

Android如何根据选择器意图中的用户操作请求权限

Android - 片段中的联系人选择器

windows照片查看器无法显示此图片,因为计算机内存不足?

Android 意图选择器不能有空的意图目标