安卓如何按顺序从相册接收图片

3
我目前有一个安卓应用程序,它有一个intent-filter来从画廊中接收图片。重要的是要以用户选择的相同顺序接收图像。这似乎是大多数设备的默认行为,但在某些设备上(目前我在运行Android 4.x的Motorola手机上看到了这种情况),排序似乎是未定义的。有没有人知道一种在意图中声明应按顺序接收图像的方法?或者一种一旦接收到图像就确定所选顺序的方法?
这是清单文件中相关的代码。
 <activity
       android:label="@string/app_name"
       android:name=".activities.ImportImagesActivity" > 
       <intent-filter>   
           <action android:name="android.intent.action.SEND" />
           <category android:name="android.intent.category.DEFAULT" /> 
           <data android:mimeType="image/*" />
       </intent-filter>
       <intent-filter>   
           <action android:name="android.intent.action.SEND_MULTIPLE" />
           <category android:name="android.intent.category.DEFAULT" /> 
           <data android:mimeType="image/*" />
       </intent-filter>
   </activity>

并且从ImportImagesActivity中

private List<Uri> parseIncomingData() {
    List<Uri> uriList = null;

    Intent intent = this.getIntent();
    if(intent != null) {
        String action = intent.getAction();
        //Single Image
        if (action.equalsIgnoreCase("android.intent.action.SEND")) {
            //removed for brevity
            }
        }
        //Multiple Images
        else if (action.equalsIgnoreCase("android.intent.action.SEND_MULTIPLE")) {
            uriList  = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        }
    }

    //more code - at this point images have been recieved

    return uriList;
}

编辑

为了更好地理解,让我解释一下应用程序的一般流程。用户打开画廊并选择图像。他们选择与我的应用程序“分享”。我的应用程序接收到一组Uri列表,然后使用自定义适配器类支持的内部画廊显示它们。根据Uri列表正确显示图像,问题在于List<Uri>的顺序有时不正确。对于我的用户来说,图像以他们选择的相同顺序出现非常重要。

澄清 当我使用“画廊”一词时,我是指内置的Android应用程序画廊。 当我使用“分享”一词时,我是指画廊应用程序中的共享按钮。这允许用户从服务列表中选择,例如Facebook,电子邮件,在这种情况下是我的应用程序。

例如 想象一下一个包含3个图像的画廊,以任意顺序显示:A、B和C。用户首先选择C,然后选择A,然后选择B,并选择与我的应用程序共享它们。在大多数手机上,我的列表将被正确排序{C,A,B},在某些手机上,此顺序似乎随机。

我无法使用创建时间戳,因为创建时间通常与选择顺序无关。添加自定义元数据也没有帮助,因为我不知道正确的初始顺序。

2个回答

1

是的,我现在也遇到了同样的问题。我也在使用Fedor的懒加载概念。我不确定这是否有多大帮助,以及这是否是正确的方法。但是它仍然为我解决了问题。

我必须对getView()进行一些修改,

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    System.gc();

    ImageView view;

    if(convertView == null) {

        view = new ImageView(context);

        view.setScaleType(ImageView.ScaleType.FIT_CENTER);
        view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
        view.setAdjustViewBounds(false);
        view.setPadding(2, 2, 2, 2);



        System.gc();

    }else {
        view = (ImageView) convertView;
    }
      if(view!=null)
        {
               imageLoader.DisplayImage(urlList.get(position), view);
               notifyDataSetChanged();  //Calling this helped to solve the problem. 
        }

    System.gc();

    return view;
}

谢谢您的建议。我已经在调用notifyDataSetChanged()。图片显示正常,问题在于我的后备数据源(URI列表)是无序的。仅出于好奇,Fedor懒加载概念是什么? - Mike
延迟加载,也称为动态函数加载,是一种模式,允许开发人员指定程序默认启动时不应加载到存储器中的组件。通常,系统加载器会自动同时加载初始程序及其所有相关组件。在延迟加载中,只有当特定组件被请求时才会加载相应的依赖项。如果大多数相关组件实际上从未被使用,延迟加载可用于提高程序性能。 - GOLDEE

1

我的观察是Android相册按照图片的时间顺序显示。

对于那些无法确定顺序的设备,您可以从相册中导入图片并检查它们的创建时间。这里有一个方法。或者您可以使用元数据提取器应用程序,可以找到许多JAR文件。

现在,您只需按照最近的顺序排列图像即可完成。

[编辑]

我有一个问题。您说它们可能以任何顺序被选择,那么他们是通过“共享”将其“上传”到服务器吗?

如果是这样,那么一种方法是检查哪个图像已上传,或者如果您想要选择的顺序,可以这样做。编辑图像的元数据,肯定会有一个无用的标记,选择一个并在触摸时进行编辑。因此,如果我选择图像A,则变为1,然后我选择图像B,则变为2。但是,如果我现在取消选择图像A,则图像B应该变为1。因此,您可以在这里使用节点。这是先进先出(FIFO)方法。取消选择后,A将从列表中删除,B将替换它。

这是你想要的吗?

编辑 抱歉,我认为你不能在不创建自己的图库的情况下完成此操作。为什么不将Android图库导入到应用程序中的网格视图中呢?


只是为了确保我理解你的意思,按照最近的顺序,你指的是创建时间吗?这在我的情况下行不通。我的用户可以以任何顺序从画廊中选择图像,并且当它们与我的应用程序共享时,它们应该以相同的顺序显示。 - Mike
请查看我的更新问题,我添加了一些上下文和澄清,以帮助您更好地理解问题。'共享'不是在我的应用程序中完成的,而是在画廊应用程序中完成的,因此在用户选择图像时我无法控制。然后用户决定将它们与我的应用程序“共享”,这导致我收到一系列Uri列表..但此时它们是无序的。 - Mike
我越看越同意你的观点,我认为这是不可能的。我会将你标记为被接受的答案,但如果有人能提出解决方案,我很乐意更改。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接