【问题标题】:Android receive images from Gallery in orderAndroid按顺序从图库接收图像
【发布时间】:2013-05-21 02:25:04
【问题描述】:

我目前有一个 Android 应用程序,它有一个意图过滤器来接收来自画廊的图像。以用户选择它们的相同顺序接收图像很重要。这似乎是大多数设备上的默认行为,但在某些设备上(到目前为止,我已经在摩托罗拉运行的 Android 4.x 上看到了这一点)订单似乎未定义。有谁知道一种方式来声明应该按顺序接收图像的意图?或者在收到图像后确定所选顺序的方法?

这是清单中的相关代码

 <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 的顺序有时不正确。对我的用户来说,重要的是图像以他们选择它们的顺序出现。

澄清 当我使用术语库时,我指的是内置的 Android 应用程序库。 当我使用“共享”一词时,我指的是图库应用程序中的“共享”按钮。这允许用户从服务列表中进行选择,例如 Facebook、电子邮件,在本例中是我的应用程序。

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

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

【问题讨论】:

    标签: java android image gallery


    【解决方案1】:

    我的观察是,Android 图库会根据图像的新近度显示图像。

    对于无法确定顺序的设备,您可以从图库中导入图片并查看其创建时间。这是一个way 来做到这一点。或者您可以使用元数据提取器应用程序,可以找到许多 jar。

    现在,你可以按照新近的顺序排列图像,你应该完成了。

    [编辑]

    我有一个问题。你说他们可以按任何顺序被选中,那么他们是通过“分享”的方式将其“上传”到服务器上吗?

    如果是这样,那么一种方法是检查上传了哪个图像,或者如果您想要选择顺序,您可以这样做。编辑图片的元数据,肯定会有一个无用的标签,选择一个并触摸编辑。所以,如果我选择图像 A,它会变为 1,然后我选择图像 B,它会变成 2。但是如果我现在取消选择图像 A,那么图像 B 应该变成 1。所以,你可以在这里使用节点。这是先进先出 (FIFO) 方法。取消选择后,A 被排除在列表之外,B 替换它。

    这是你想要的吗?

    编辑 抱歉,如果不创建自己的画廊,我认为您无法做到这一点。为什么不直接将 android 库导入到应用程序的网格视图中?

    【讨论】:

    • 只是为了确保我正确理解您,按新近顺序,您是指创建时间吗?这在我的情况下不起作用。我的用户可以按任意顺序从图库中选择图像,当它们与我的应用共享时,它们应该以相同的顺序显示。
    • 请查看我更新的问题,我添加了一些上下文和说明以帮助您更好地理解问题。 “共享”不是在我的应用程序中完成的,而是在图库应用程序中完成的,所以当用户选择图像时我无法控制。然后,用户决定与我的应用程序“共享”它们,这导致我收到 Uris 列表..但此时它们出现故障。
    • 我研究得越多,我开始同意你的观点,我认为这是不可能的。我将标记你接受的答案,但如果有人能提出解决方案,我很乐意改变这一点。
    【解决方案2】:

    是的,我现在也遇到了同样的问题。我也在使用 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 延迟加载的概念是什么?
    • 延迟加载,也称为动态函数加载,是一种允许开发者在程序启动时指定程序的哪些组件默认不加载到存储中的模式。通常,系统加载器会同时自动加载初始程序及其所有相关组件。在延迟加载中,依赖项仅在特别请求时才加载。如果大多数依赖组件从未实际使用过,则可以使用延迟加载来提高程序的性能。
    猜你喜欢
    • 2015-03-22
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多