2013-04-17 39 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