3

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

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

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

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

4

2 回答 2

1

我的观察是,Android 画廊根据它们的新近显示图像。

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

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

[编辑]

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

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

这是你想要的吗?

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

于 2013-01-13T19:05:24.953 回答
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;
}
于 2013-01-17T05:02:39.813 回答