2

Android 3.1(API 12)-厳密に言えば、これは商用アプリであり、他のデバイスにはありません。

ImageView私(n00b)は、サーバー上のMysqlにBlobとして保存されている画像の配列を取得し、Androidのに追加しようとしています。

base64_encodeまず、サーバー側:するかどうかはわかりませんjson_encodeが、現在のPHPと結果は次のとおりです。


PHP:

$query = "SELECT `locations`.`businessName`, `photos`.`img` 
        FROM `locations` 
        JOIN `photos` ON `locations`.`co_id` = `photos`.`co_id` 
        WHERE `locations`.`businessName` = '".$companyID."'";

    mysql_connect($dbserver, $dbusername, $dbpassword) or die(mysql_error());
    mysql_select_db($dbname) or die(mysql_error());

    $result = mysql_query($query) or die(mysql_error());  


    while ($row = mysql_fetch_array($result)) {
        $finalImg[] = $row['img'];

        foreach ($finalImg as $img) {
            $finallyWeAreThere = base64_encode($img);
        }

    }

    echo $finallyWeAreThere;

    mysql_close();

結果:

/9j/4AAQSkZJRgABAQEAYABgAAD/... and so on.. and so on..

さて、Android側に移りましょう。画像をプルする前に、同じデータベースに別の場所で接続してActivity会社名のリストを取得します(成功しました)。会社名をクリックすると、会社名を意図的にメインクラスに渡すことで画像が収集されます。 。

私は会社名の収集の成功を出発点として使用したので、このMain.javaファイルコードは非常に生であり、潜在的に非常に間違っています。

Main.javafor (現時点では、すべての画像を表示するためのorループは含まれていませんwhile。この時点で、1つの画像だけが返されることを嬉しく思います):

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Get the appropriate layout
        setContentView(R.layout.main);

        Bundle extras = getIntent().getExtras();
        businessName = extras.getString("companyName");

        // Load AsyncTask to get photos from server
        new RetrievePhotos().execute(businessName);
    }

    class RetrievePhotos extends AsyncTask<String, String, Void> {
        private ProgressDialog progressDialog = new ProgressDialog(Main.this);
        InputStream inputStream = null;
        String result = ""; 

        protected void onPreExecute() {
            progressDialog.setMessage("Gathering photos...");
            progressDialog.show();
            progressDialog.setOnCancelListener(new OnCancelListener() {
                public void onCancel(DialogInterface diaInterface) {
                    RetrievePhotos.this.cancel(true);
                    diaInterface.dismiss();
                }
            });
        }

        @Override
        protected Void doInBackground(String... params) {

            String url_select = "http://www.someCompany.com/someFile.php?imgTest=true&companyName=" + businessName;
            imView = (ImageView)findViewById(R.id.imageView1);

            ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            try {
                // Set up HTTP post
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url_select);
                httpPost.setEntity(new UrlEncodedFormEntity(param));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();

                // Read content & Log

                inputStream = httpEntity.getContent();
                bmImg = BitmapFactory.decodeStream(inputStream);
                imView.setImageBitmap(bmImg);

                Log.i("HttpClient", "Called on the HTTP Client and went to: " + url_select);
            } catch (UnsupportedEncodingException e1) {
                Log.e("UnsupportedEncodingException", e1.toString());
                e1.printStackTrace();
            } catch (ClientProtocolException e2) {
                Log.e("ClientProtocolException", e2.toString());
                e2.printStackTrace();
            } catch (IllegalStateException e3) {
                Log.e("IllegalStateException", e3.toString());
                e3.printStackTrace();
            } catch (IOException e4) {
                Log.e("IOException", e4.toString());
                e4.printStackTrace();
            }

            // Convert response to string using String Builder
            try {
                BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8);
                StringBuilder sBuilder = new StringBuilder();

                String line = null;
                while ((line = bReader.readLine()) != null) {
                    sBuilder.append(line + "\n");
                }

                inputStream.close();
                result = sBuilder.toString();

            } catch (Exception e) {
                Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString());
            }
            return null;

        } // end doInBackground

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/hsdarker"
    android:baselineAligned="false"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="150dp"
        android:layout_height="112dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="75dp"
        android:layout_marginTop="50dp" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="300dp"
        android:layout_height="225dp"
        android:layout_below="@id/imageView1"
        android:layout_toRightOf="@id/imageView1" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="150dp"
        android:layout_height="112dp"
        android:layout_alignTop="@id/imageView1"
        android:layout_marginLeft="208dp"
        android:layout_toRightOf="@id/imageView2" />

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="300dp"
        android:layout_height="225dp"
        android:layout_below="@id/imageView3"
        android:layout_marginRight="75dp"
        android:layout_toRightOf="@id/imageView3" />

</RelativeLayout>

Logcatエラーログ:

07-17 09:39:00.775: W/dalvikvm(5222): threadid=11: thread exiting with uncaught exception (group=0x40202760)
07-17 09:39:00.775: E/AndroidRuntime(5222): FATAL EXCEPTION: AsyncTask #2
07-17 09:39:00.775: E/AndroidRuntime(5222): java.lang.RuntimeException: An error occured while executing doInBackground()
07-17 09:39:00.775: E/AndroidRuntime(5222):     at android.os.AsyncTask$3.done(AsyncTask.java:266)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.lang.Thread.run(Thread.java:1020)
07-17 09:39:00.775: E/AndroidRuntime(5222): Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 82: http://www.holidaysigns.com/db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.net.URI.create(URI.java:769)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at holidaysigns.nst.Main$RetrievePhotos.doInBackground(Main.java:148)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at holidaysigns.nst.Main$RetrievePhotos.doInBackground(Main.java:1)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
07-17 09:39:00.775: E/AndroidRuntime(5222):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-17 09:39:00.775: E/AndroidRuntime(5222):     ... 4 more

私はこれについてノンストップで調査しましたが、正直なところ、この時点でどこに行くべきか、またはサーバー側で適切に設定しているかどうかはわかりません。n00bであることをお詫び申し上げます。どんな助けや指示も大歓迎です。

4

2 に答える 2

4

2つの問題があります。

まず、URLが適切にエンコードされていません。問題の原因となっているbusinessNameのスペースである可能性があります。businessNameに表示される可能性のあるスペースや特殊文字を処理するには、URLEncoder.encode(businessName、 "UTF-8")が必要です。したがって、 "companyName =HOLIDAYSIGNS"は"companyName= HOLIDAY+SIGNS"になります。

2番目の問題は、バックグラウンドスレッド内にImageViewを設定しようとしていることです。メインスレッド(UIスレッド)でImageViewの内容を設定する必要があります。doInBackground()を変更して、voidではなくデコードされたビットマップを返し、ビットマップをImageViewに設定するonPostExcecute(Bitmapビットマップ)メソッドを追加します。onPostExecuteはUIスレッドで実行されます。(必ずnullを確認してください)。

于 2012-07-17T14:26:58.533 に答える
1

URL

http://www.holidaysigns.com/db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS

例外によると、違法な性格を持っています。

この文字はスペース「」です。すべてのスペースをプラス(+)記号に置き換えて、再試行してください。

スペースが違法である理由は次のとおりです。

一般的なHTTPリクエストは次のように開始されます。

GET /url HTTP/1.1

したがって、スペースで区切られた3つのものがあります。メソッド、URI、およびHTTPプロトコルバージョンです。あなたがそこにあなたのようなURLを入れたらどうしますか?

GET /db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS HTTP/1.1

Method: GET
URL: /db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY
HTTP VERSION: SIGNS

...何かがうまくいかなかったでしょう?

そして、これがスペースが許可されない理由です。

于 2012-07-17T14:20:34.710 に答える