Reputation: 2485
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
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
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
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
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
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
Reputation: 131
To accomplish this
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
Reputation: 2276
Add the
--address="0.0.0.0"
as the app engine server address parameter to accept from all incoming connections.
Upvotes: 0