2013-04-17 41 views
0

我正在从mysql中通过php获取图像 并使用asyntask获取它<> $ b64image值正在获取我的android代码。 ?将位图值转换为Imageview

<?php 

include("db.php"); 

include("database.php"); 

//header("Content-Type: image/jpeg"); 



$skt=$_REQUEST['clientsocket']; 

$retrieve = SelectSingleRow("screendb"," clientsocket='$skt'",""); 

$val=$retrieve['img']; 

$response["img_val"]=$val; 

$b64image["base64_image"] = base64_encode($val); 

echo json_encode($b64image); 

>

我取类: 它没有显示任何错误,但不显示图像。
在strbase64_image获得$ b64image的值。

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Base64; 
import android.util.Log; 
import android.view.ContextThemeWrapper; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ImageView; 


public class fetchimg extends Activity { 
    int flag; 
    int empid; 
    String username; 
    String password; 
    ImageView imageView; 
    EditText edUsername,edPassword; 

    private ProgressDialog pDialog; 

    JSONParser jParser = new JSONParser(); 
    JSONArray jarray; 

    ArrayList<HashMap<String, String>> productsList; 

    private static String url_faculty_login = "http://10.0.2.2/image/image_decode.php"; 
    private static final String TAG_EMPLOYEE = "employee_id"; 
    private static final String TAG_PID = "pid"; 
    private static final String TAG_NAME = "name"; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.showimage); 
    // setTitleColor(1); 
     imageView=(ImageView) findViewById(R.id.imgView); 

     Intent i=new Intent(); 


     edUsername=(EditText) findViewById(R.id.edUserName); 
     edPassword=(EditText) findViewById(R.id.edPassword); 
     String clear="clear"; 
     new LoadAllProducts().execute(); 




    } 



    class LoadAllProducts extends AsyncTask<String, String, String> { 
     private static final String Emp_id = "Emp_id"; 
     Bitmap bitmap; 
     String strbase64_image; 

     public String doInBackground(String... args) { 
      username="port=1892"; 
     // password=edPassword.getText().toString(); 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      params.add(new BasicNameValuePair("clientsocket", username)); 
     // params.add(new BasicNameValuePair("Password", password)); 



      JSONObject json = jParser.makeHttpRequest(url_faculty_login, "GET", params); 
      Log.d("base64image_encoded from php ", json.toString()); 

      strbase64_image=json.toString(); 

      bitmap =Base64ToImage(strbase64_image); 

     return null; 
    } 
     public Bitmap Base64ToImage(String base64String) { 
      byte[] imageAsBytes = Base64.decode(base64String.getBytes(), 
        Base64.DEFAULT); 
      Bitmap mybitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, 
        imageAsBytes.length); 
      return mybitmap; 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        imageView.setImageBitmap(bitmap); 


       } 
      }); 

     } 

} 



} 
+0

您的PHP可能会受到sql注入攻击。 –

+0

onPostExecute中的runOnUiThread无用,因为onPostExecute位于ui线程上。 – njzk2

回答

0

您的AsyncTask都搞砸了,因此它不起作用。

您的doInBackground没有返回任何内容,因此您的onPostExecute永远不会被调用,并且您的返回类型不正确。

尝试使用这个来代替:

class LoadAllProducts extends AsyncTask<Void, Void, Bitmap> { 
     private static final String Emp_id = "Emp_id"; 
     Bitmap bitmap; 
     String strbase64_image; 

     protected Bitmap doInBackground(Void... args) { 
      username = "port=1892"; 
      // password=edPassword.getText().toString(); 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      params.add(new BasicNameValuePair("clientsocket", username)); 
      // params.add(new BasicNameValuePair("Password", password)); 

      JSONObject json = jParser.makeHttpRequest(url_faculty_login, "GET", 
        params); 
      Log.d("base64image_encoded from php ", json.toString()); 

      strbase64_image = json.toString(); 

      bitmap = Base64ToImage(strbase64_image); 

      return bitmap; 
     } 

     private Bitmap Base64ToImage(String base64String) { 
      byte[] imageAsBytes = Base64.decode(base64String.getBytes(), 
        Base64.DEFAULT); 
      Bitmap mybitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, 
        imageAsBytes.length); 
      return mybitmap; 
     } 

     protected void onPostExecute(Bitmap result) { 

      // TODO Auto-generated method stub 
      imageView.setImageBitmap(bitmap); 

     } 
    } 

在这里,您doInBackground返回检索Bitmap,将它传递给onPostExecute这反过来又更新您的ImageView。无需使用runOnUiThread,因为postExecute已经在UI线程上运行。

+0

错误。问题中的doInBackground返回'null',这是一些东西。 onPostExecute被调用。您的重新格式化要好得多,但对问题的分析不正确,问题仍然存在。 – njzk2

+0

在我的理解中,如果您返回null,而onPostExecute期待String,则不会发生任何事情。虽然我可能会错误的,因为我没有运行他的代码。 –

+0

一个字符串可以为null,如'String toto = null;' – njzk2

0
strbase64_image=json.toString(); 

应该是:

strbase64_image=json.getString("base64_image"); 

json是在形式表示的JSONObject

{"base64_image": "AAAAAAA(... some BASE64 content ...)"} 

因为它是由json_encode在php代码创建的关联数组

+0

非常感谢您的快速回复...它的工作原理 – user2289464