0

ポストphp経由で画像と文字列を一緒に送信しようとしています。外部jar httpclientandroidlib-1.1.2.jarを追加しましたが、常にクラッシュします。以下の両方のコードを試しましたが、それでもクラッシュします。以下のコードはスナップショットを取り、ボタン アップロード アップロードする必要があります。

Button btn=(Button)findViewById(R.id.snapshot);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent i=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(i, 0);

            }
        });

        uploadButton=(Button)findViewById(R.id.uploadButton);

            uploadButton.setOnClickListener(new OnClickListener() {            
                @Override
                public void onClick(View v) {

                    if (finalFile!=null) {

                        HttpPost httpost = new HttpPost("http://example/test.php");
                        MultipartEntity entity = new MultipartEntity();
                        try {
                            entity.addPart("name", new StringBody("test"));
                        } catch (UnsupportedEncodingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        entity.addPart("image", new FileBody(finalFile));

                        httpost.setEntity(entity);
                        HttpResponse response;
                        HttpClient httpclient = null;
                        try {
                            response = httpclient.execute(httpost);
                        } catch (ClientProtocolException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }
                }});


    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
    //  super.onActivityResult(requestCode, resultCode, data);

        if (requestCode==0) {

            if (data!=null) {


                Bitmap bt=(Bitmap) data.getExtras().get("data");

                Uri tempUri = getImageUri(getApplicationContext(), bt);

                 finalFile = new File(getRealPathFromURI(tempUri));

            }

        }


    }


public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
}

また、以下のコードは機能しません。両方のコードを試しました。

                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(
                            "http://example/test.php");

                    try {
                        MultipartEntity entity = new MultipartEntity();

                        entity.addPart("name", new StringBody("test"));
                        entity.addPart("image", new FileBody(finalFile));

                        httppost.setEntity(entity);
                        HttpResponse response = httpclient.execute(httppost);

                        Log.e("test", "SC:" + response.getStatusLine().getStatusCode());

                        HttpEntity resEntity = response.getEntity();

                        BufferedReader reader = new BufferedReader(new InputStreamReader(
                                response.getEntity().getContent(), "UTF-8"));
                        String sResponse;
                        StringBuilder s = new StringBuilder();

                        while ((sResponse = reader.readLine()) != null) {
                            s = s.append(sResponse);
                        }
                        Log.e("test", "Response: " + s);
        } catch (ClientProtocolException e) {
                } catch (IOException e) {
                }

logcat エラーの 1 つ:

 FATAL EXCEPTION: main
 java.lang.NoClassDefFoundError: ch.boye.httpclientandroidlib.client.methods.HttpPost
    at com.example.MainActivity$2.onClick(MainActivity.java:158)
    at android.view.View.performClick(View.java:3549)
    at android.view.View$PerformClick.run(View.java:14393)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:4945)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

他のコードの場合:

 FATAL EXCEPTION: main
 android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1178)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:394)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:245)
    at java.net.InetAddress.getAllByName(InetAddress.java:220)
    at ch.boye.httpclientandroidlib.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
    at ch.boye.httpclientandroidlib.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:278)
    at ch.boye.httpclientandroidlib.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:162)
    at ch.boye.httpclientandroidlib.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
    at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)
    at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
    at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:902)
    at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:801)
    at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:780)
    at com.example1.MainActivity$2.onClick(MainActivity.java:133)
    at android.view.View.performClick(View.java:3549)
    at android.view.View$PerformClick.run(View.java:14393)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:4945)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

PHP ファイル:

<?php
$name=$_POST['name'];
$file = $_FILES['image'];
if (isset($name))
{
        $connect=mysql_connect("localhost","localhost","localhost") or die ('Connection error!!!');
        mysql_select_db("localhost") or die ('Database error!!!');
        $file_path = "/localhost/localhost/";

                if(move_uploaded_file($file, $file_path)) {
                 $query1=("INSERT INTO example(name,link) VALUES ( '$name','$file_path')");

            $query=mysql_query($query1)  or die(mysql_error()); 
            $json_output ='{"test":{"test":"'.$file.'"}}';
                } 

        echo trim($json_output);
        mysql_close($connect) or die ('Unable to close the connection!!!');;        
}
?>
4

1 に答える 1

0
 android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1178)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:394)

メインスレッドでネットワーク操作を実行しようとしていることを意味します。代わりに、これらの種類の操作を行うように設計された which を
使用してください。AsyncTask()

テスト目的で、 setcontentview only の後に次を追加して、コードが機能するかどうかを確認できます。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

コードが機能することを確認したら、AsyncTask を使用しないでください。StrictMode を使用することは強くお勧めしません。

于 2013-11-27T02:25:04.180 に答える