从PHP服务器获取图片到Android

5
我正在设计一个Android应用程序,需要从Web服务器获取图像并在Android ListView中显示。我通过这个主题了解了Android端的事情(尽管还没有实现和测试)Lazy load of images in ListView
我需要PHP/服务器端的帮助。需要在列表视图中填充的特定图像将根据动态决定(那些具有给定标记的图像)。虽然我是新手,但已经成功设置了可以运行PHP脚本的Web服务器。
1)Android决定要检索哪些标记。建立HTTP连接并使用给定的标记作为参数调用PHP脚本。
2)PHP脚本查找MySQL数据库以获取标记,并决定要上传的图像的id,这些图像存储在一个文件夹中。
3)[这里我不清楚如何实现] PHP发送这些图像,然后是与每个图像相关联的元数据。要发送的记录数量不会提前固定,而是由MySQL返回的记录数量决定(最多仅固定)。
我将非常感激任何示例脚本,并指出我可以找到更多信息以更好地理解内部工作原理的地方。此外,如果有更好的框架可实现我的目标,我很乐意了解(我不依赖于PHP/MySQL)。
4个回答

4
这是获取单个图像并在图像视图中显示的代码。
public class Database_demo extends Activity {

public static final int DIALOG_DOWNLOAD_JSON_PROGRESS = 0;

int[] flags;
String strImageName;
int n = 10000;
String[] mySecondStringArray = new String[n];
String[] strArray;

HashMap<String, String> hm;
List<HashMap<String, String>> aList;
InputStream is = null;
String result = "";
JSONObject jArray = null;
private String Qrimage;
private Bitmap bmp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.news);

    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(
                "http://192.168.1.50/XXXX/getimage.php");
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    } catch (Exception e) {
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
        jArray = new JSONObject(result);
        JSONArray json = jArray.getJSONArray("tablename");
        for (int i = 0; i < json.length(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            JSONObject e = json.getJSONObject(i);
            Qrimage = e.getString("imagefieldname");
            System.out.println(Qrimage);

            byte[] qrimage = Base64.decode(Qrimage.getBytes(), i);

            System.out.println(qrimage);
            bmp = BitmapFactory.decodeByteArray(qrimage, 0, qrimage.length);
            ImageView imageview = (ImageView) findViewById(R.id.flag);

            imageview.setImageBitmap(bmp);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}
  }

Php file

<?php
$host="localhost"; //replace with database hostname 
$username="root"; //replace with database username 
$password=""; //replace with database password 
$db_name="databasename"; //replace with database name

$con=mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");




$sql = "SELECT * FROM tablename"; 

$result1 = mysql_query($sql);

$json = array();

if(mysql_num_rows($result1)){
while($row=mysql_fetch_assoc($result1)){
$json['tablename'][]=$row;
}
}


mysql_close($con);
echo json_encode($json); 

?> 

1

我想你应该使用JSON通过HTTP连接向移动设备发送数据。对于低速网络连接,我不推荐使用SOAP。

如果您无法直接通过HTTP URL加载图像,则可以在JSON中发送图像数据和MIME类型,并通过图像数据创建图像对象。


谢谢,Waqar。你有关于JSON和SOAP的特定论点吗?为什么我应该更喜欢JSON?另外,如果你能提供一些示例脚本,我会很感激的。再次感谢。 - KMS
是的,我曾经在一个项目上使用了SOAP,但那时候并不是个好主意,因为SOAP是一种运行在HTTP上的协议,所以性能很慢。它通常用于开发第三方API,如果你正在处理自己代码的两端,那么你必须使用JSON或XML。或者,如果你认为API调用不应该公开,那就实现OAuth。看看Facebook、Twitter等SDK! - Waqar Alamgir

0

我使用了InputStream和OutputStream,就像你用Java下载文件一样。首先,我从PHP/JSON脚本中获取服务器上的文件名。当然,这种方法可以进行优化,以清除缓存文件夹中的旧文件。

private static File getImage(String filename) {
    String localFilename = new File(filename).getName();

    File img = new File("/sdcard/app/tmp/" + localFilename);

    // Create directories
    new File("/sdcard/app/tmp/").mkdirs();

    // only download new images
    if (!img.exists()) {
        try {
            URL imageUrl = new URL("http://example.com/images/" + filename);
            InputStream in = imageUrl.openStream();
            OutputStream out = new BufferedOutputStream(new FileOutputStream(img));

            for (int b; (b = in.read()) != -1;) {
                out.write(b);
            }
            out.close();
            in.close();
        } catch (MalformedURLException e) {
            img = null;
        } catch (IOException e) {
            img = null;
        }
    }
    return img;
}

使用这种解决方案似乎需要为每个文件下载建立单独的连接。如果我每次需要下载数十张图片,是否会有额外开销?此外,我需要获取与每个图像相关联的元数据。 - KMS
确实,但我不知道如何一次下载多个图像。我首先使用JSON下载元数据(包括文件名),然后添加一个for循环,使用此方法下载每个图像。 - Henridv
谢谢,我会尝试这种方法。实际上,即使文件名已知,图像文件夹也不会向客户端公开。不确定这种情况的最佳做法是什么。 - KMS

0

nusoap和php读取链接 - PedroAGSantos
对于网络连接较差的情况,我不推荐使用SOAP。请改用JSON。 - Waqar Alamgir

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