AsafK
AsafK

Reputation: 2485

Google App Engine with Android - testing endpoints on real device

I've been following the tutorial in Creating an Endpoints Backend from an Android Project. Everything is being compiled and looks promising. The backend is up.

I changed CloudEndpointUtils#LOCAL_ANDROID_RUN to true. But when I try to test the app on a real device (not emulator) I'm failing on:

java.net.SocketException: failed to connect to /10.0.2.2 (port 8888) after 20000ms: isConnected failed: EHOSTUNREACH (No route to host)

So I looked at CloudEndpointUtils and saw that setting LOCAL_ANDROID_RUN to true makes the app look for DevAppServer in http://10.0.2.2:8888, which is the emulator virtual router.

But I'm not using the emulator. So I tried to change the constant holding this url to http://127.0.0.1:8888/ but still no luck. I'm now failing on:

java.net.ConnectException: failed to connect to /127.0.0.1 (port 8888) after 20000ms: isConnected failed: ECONNREFUSED (Connection refused)

I thought it might be because my PC is behind a firewall, so I disabled it, but still nothing.

Any suggestion would be appreciated.

Upvotes: 6

Views: 6682

Answers (7)

Albert Vila Calvo
Albert Vila Calvo

Reputation: 15835

There are many answers here but I've found them messy or uncomplete. To run the local server on your computer and test it with a real device do this:

1) Add httpAddress = "0.0.0.0" to the appengine block in your build.gradle file of the backend (Google Cloud Endpoint) module, like this:

appengine {
    ...
    httpAddress = "0.0.0.0"
}

According to a comment on the question this means that 'will accept from anywhere'.

2) Run your backend module locally (ie. start the web server). This is trivial: select the backend configuration on the drop-down menu and press the green button. You can find more detailed instructions here.

You should now be able to open a browser (on your computer) and navigate to http://localhost:8080/ and see a webpage with 'Hello, Endpoints!' and many other stuff.

3) Find your computer's IP address (on a Mac go to System Preferences -> Network) and then set it as the root url in your Android app code, like this:

MyApi.Builder builder = new MyApi.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new AndroidJsonFactory(), 
                            null
).setRootUrl("http://192.168.1.36:8080/_ah/api/")

That's all!

Upvotes: 6

Ismael ozil
Ismael ozil

Reputation: 571

Address 10.0.2.2 is for accessing localhost using the emulator, to access localhost using a real device, use the following steps

-open your commandline (cmd) run ipconfig. -Get the ipaddress of your computer and replace 10.0.2.2 with it, -Build and run on your device.

Hope this helps someone

Upvotes: -2

kg.
kg.

Reputation: 561

If you want to do this in Android Studio, set httpAddress as follows in your build.gradle

appengine {

  ...

  httpAddress = "0.0.0.0"
}

Upvotes: 12

virtas
virtas

Reputation: 63

When locally testing Google cloud endpoints from none localhost address --address="0.0.0.0" setting might not be sufficient.

My Endpoints were giving 404 Not Found error when accessing from non localhost. I resolved it by including path parameter in API decoration.

My API annotation looked like this:

@ApiMethod(name="saveResponse", httpMethod = "post", path="saveResponse)
public Response saveResponse(@Named("answerString") String responseString)

Upvotes: 1

Campino
Campino

Reputation: 862

Follow the 2. point post by user248187 2.(Contniued) Go to Arugments -> add exactly like this --address=0.0.0.0 --port=.......

Now, On the client android code you need change the request IP (RootURL) of your services to local IP. You can do that by use builder.setRootUrl(). It is good that you add a flat for outomatice it on you android client, then it can switch between local and deployed app-engiene quickly. Such as:

//........................

private boolean mFlatLocalHostServer=true;  
private static final String LOCAL_IP = "192.168.1.11"; //Ip debug server
public static final String  LOCAL_SERVER_IP = "http://"+LOCAL_IP+":8888/_ah/api";
//......................
Mydataendpoint.Builder builder = new Mydataendpoint.Builder(
                                AndroidHttp.newCompatibleTransport(),
                                new GsonFactory(),
                                        mCredential); 

//request the  service to local ip 
if(mFlatLocalHostServer){
         builder.setRootUrl(LOCAL_SERVER_IP); 
}

Mydataendpoint service =  builder.build();
response=service.insertMyData(mydata).execute(); 

Upvotes: 0

user248187
user248187

Reputation: 131

To accomplish this

  1. Put LOCAL_APP_ENGINE_SERVER_URL_FOR_ANDROID = your IP address (this is in your android App)
  2. Right click on App-Engine project -> Run-> Run Configurations -> Web Application(left bar) -> your app-engine project.

2.(Contniued) Go to Arugments -> add exactly like this

--address=0.0.0.0 --port=.......

*to get your ip address, go to cmd -> ipconfig -> add (IPV4 address with port number) in step 1

important note: Please change this everytime in case you are accessing internet from dongle or some dynamic IP internet service

Thankyou ... this works perfectly

Upvotes: 7

Faisal
Faisal

Reputation: 2276

Add the

--address="0.0.0.0" 

as the app engine server address parameter to accept from all incoming connections.

Upvotes: 0

Related Questions