2

I am creating a simple app on Android SDK. I created an Android Client and Java Server. Now what I have created is that Android app browse for image from gallery and show the Path on the screen. Also, it displays the image, which was showed. To start the sending connection thing firstly I run the Java Server. Then I run the app on my phone. I choose the photo and then press send. The app fezzes after the push and forces to close. Below you can see my code. Any ideas?

Android Client

package com.example.workingclient;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class SendfileActivity extends Activity {
    /** Called when the activity is first created. */

    private static final int SELECT_PICTURE = 1;

    private String selectedImagePath;
    private ImageView img;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("34");
        img = (ImageView) findViewById(R.id.ivPic);
        System.out.println("36");
        ((Button) findViewById(R.id.bBrowse))
                .setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) {
                        System.out.println("40");
                        Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(
                                Intent.createChooser(intent, "Select Picture"),
                                SELECT_PICTURE);
                        System.out.println("47");
                    }
                });
        ;
        System.out.println("51");
        Button send = (Button) findViewById(R.id.bSend);
        final TextView status = (TextView) findViewById(R.id.tvStatus);

        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Socket sock;
                try {
                    sock = new Socket("192.168.0.3", 27015); 
                    System.out.println("Connecting...");

                     // sendfile
                          File myFile = new File (selectedImagePath); 
                          byte [] mybytearray  = new byte [(int)myFile.length()];
                          FileInputStream fis = new FileInputStream(myFile);
                          BufferedInputStream bis = new BufferedInputStream(fis);
                          bis.read(mybytearray,0,mybytearray.length);
                          OutputStream os = sock.getOutputStream();
                          System.out.println("Sending...");
                          os.write(mybytearray,0,mybytearray.length);
                          os.flush();

                        sock.close();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                TextView path = (TextView) findViewById(R.id.tvPath);
                path.setText("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
            }
        }
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
}

Android main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvStatus"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="hello" />

    <TextView
        android:id="@+id/tvPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Path: " />

    <Button
        android:id="@+id/bBrowse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Browse" >
    </Button>

    <Button
        android:id="@+id/bSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send" />

    <ImageView
        android:id="@+id/ivPic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ImageView>

</LinearLayout>

Android AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.workingclient"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.workingclient.SendfileActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest> 

Java Server

import java.io.*;
import java.net.*;

public class FileServer {

    public static void main(String[] args) throws IOException {
        int filesize = 6022386; // filesize temporary hardcoded

        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;

        // create socket
        ServerSocket servsock = new ServerSocket(27015);
        while (true) {
            System.out.println("Waiting...");

            Socket sock = servsock.accept();
            System.out.println("Accepted connection : " + sock);

            // receive file
            byte[] mybytearray = new byte[filesize];
            InputStream is = sock.getInputStream();
            FileOutputStream fos = new FileOutputStream(
                    "C:\\Users\\5750G\\Desktop\\Test.jpg"); // destination
                                                                    // path and
                                                                    // name of
                                                                    // file
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            bytesRead = is.read(mybytearray, 0, mybytearray.length);
            current = bytesRead;

            // thanks to A. Cádiz for the bug fix
            do {
                bytesRead = is.read(mybytearray, current,
                        (mybytearray.length - current));
                if (bytesRead >= 0)
                    current += bytesRead;
            } while (bytesRead > -1);

            bos.write(mybytearray, 0, current);
            bos.flush();
            long end = System.currentTimeMillis();
            System.out.println(end - start);
            bos.close();

            sock.close();
        }
    }

}

Error

02-05 17:26:21.871: I/Start Server Button Clicked(22924): yipee
02-05 17:26:21.871: D/AndroidRuntime(22924): Shutting down VM
02-05 17:26:21.871: W/dalvikvm(22924): threadid=1: thread exiting with uncaught exception (group=0x40c5e1f8)
02-05 17:26:21.876: E/AndroidRuntime(22924): FATAL EXCEPTION: main
02-05 17:26:21.876: E/AndroidRuntime(22924): android.os.NetworkOnMainThreadException
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at libcore.io.IoBridge.connect(IoBridge.java:112)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.Socket.startupSocket(Socket.java:566)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.Socket.tryAllAddresses(Socket.java:127)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.Socket.<init>(Socket.java:177)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.net.Socket.<init>(Socket.java:149)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at com.example.workingclient.SendfileActivity$2.onClick(SendfileActivity.java:93)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.view.View.performClick(View.java:3627)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.view.View$PerformClick.run(View.java:14329)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.os.Handler.handleCallback(Handler.java:605)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.os.Looper.loop(Looper.java:137)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at android.app.ActivityThread.main(ActivityThread.java:4511)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.lang.reflect.Method.invokeNative(Native Method)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at java.lang.reflect.Method.invoke(Method.java:511)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
02-05 17:26:21.876: E/AndroidRuntime(22924):    at dalvik.system.NativeStart.main(Native Method)
02-05 17:26:47.916: I/Process(22924): Sending signal. PID: 22924 SIG: 9
02-05 17:36:15.351: I/System.out(23357): 34
02-05 17:36:15.351: I/System.out(23357): 36
02-05 17:36:15.351: I/System.out(23357): 51
02-05 17:36:15.416: D/CLIPBOARD(23357): Hide Clipboard dialog at Starting input: finished by someone else... !
ssmrkj
  • 38
  • 1
  • 7

1 Answers1

2

You have a NetworkOnMainThreadException. The solution is to put the upload code in its own thread or in an AsyncTask.

greenapps
  • 34
  • 1