Android: Open/read or copy file in local network - java

completely newby in Android, coming from c# world..
I've written a little private app for android and that must not be available on play store and the like...
the app is using JTDS to directly connect to local SQL Server to manage "inputs" from the device, and it works as expected :)
again, the app can not be updated via play store, but now I'd like to provide a feature to update it [occasionally it will :)]
so I'd like to verify on a local network share a text file containing the latest build available and, eventually, copying the "new" apk to android \Download directory...
but I still have to find a way to "read\connect" the the LAN's share...
I've seen other threads like
How to use httpget in my app
and basically my code follows How to get file via HttpGet from pc in local network on android
but the code "fails" with 404 status code...
in the HttpGet(file) I've provided the LAN location of the file I need to read, like
String file = "http://192.168.x.xxx/NetworkShare/file2read.txt";
the share is on a Windows7 machine with readonly permissions and no authentication required... It's not a Windows Domain, it's just a WorkGroup so permissions troubles should be excluded...
I'm still checking with the emulator and not the physical devices...
the manifest already includes Internet permissions, WIFI_STATE, NETWORK_STATE
If helps, I'm using Android Studio 1.1.0
any hint or alternative?
TIA
asql

What you try to do with HttpGet won't work with a Lan location because when you share a directory you are using SMB,CIFS or NFS protocol and it's impossible to access those files via HTTP. If you want to use HttpGet you must publish your files through a HTTP server.
I think there is no way to mount a drive programmatically in Android. It is possible with busybox but maybe you need to be root.
The best way to do what you want is getting the information from a webservice or maybe downloading your file from a ftp server.

Related

WebDAV authentication through Java

I've made a program which copies files from phone to windows folder. Connection to phone via WebDAV server. The problem is that I cannot connect to phone through Java until I open for ex. htpp://192.168.1.40:8080 in my windows explorer. After that phone is visible in Java. But that ruins all the meaning of my program.
Does anyone knows how to get access to phone through Java in the first place? Do I need to change something in registry or?
Thanks a lot!
P.S. copying procedure goes by:
File src = new File("\\\\" + address + "\\DavWWWRoot\\DCIM\\Camera");
where address is "192.168.x.xx:8080"
and then it goes to Files.walkFileTree to copy all the files.
You have to use a WebDAV client if you do not want to rely on the OS. I suggest Apache Virtual Filesystem (VFS). It provides an additional layer over different types of filesystems and seems to have also support for WebDAV.
https://commons.apache.org/proper/commons-vfs/index.html
Well..I've made a bit different but most simplest way to solve my problem.
The whole problem was in this goddamn Windows OS. It has WebClient service on demand by default. I switched it to auto and now I can connect to phone (or any other WebDAV server) after reboot.
CMD code to switch to auto WebClient service:
sc config webclient start=auto
Run as Admin.
P.S. But I have to admit that my way (walkFileTree) to copy files from WebDAV server may be way far from the optimal.

Cannot connect to localhost API from Android app

I am new to Django. I have created an API named http://127.0.0.1:8000/api/update/1/ and it works perfectly in the browser and on the Postman app.
However, when I am trying to access the API from the Android app it is returning NULL.
The android code works when the API is the following.
http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66
However, it does not work when the API is the following, even if the following API works just fine from my browser running in the same PC and from the Postman application.
http://127.0.0.1:8000/api/update/1/
I am attaching the code where API call is made.
protected String doInBackground(String... args) {
String xml = "";
String api = "http://127.0.0.1:8000/api/update/1/"; // returns NULL works in Postman app and in the browser
// String api = "http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66"; // works in all places
String urlParameters = "";
xml = Function.excuteGet(api, urlParameters);
return xml;
}
Can anyone help me with this? Thanks in advance.
If you are testing your application from a real android device then you need to put the IP address of your PC while you are trying to connect to your Django server through APIs. And yes, you need to be in the same network as well. So you need to check the following things.
Make sure that the PC (where you are running the server) and the Android device (where you are testing your application) are in the same network (connected with same Wifi network maybe).
Make sure you are connecting to the IP address of your PC where the server is running. For example, right now, the IP address of your PC is 192.168.0.100. Then, you need to connect to this IP address and call your API like the following.
http://192.168.0.100:8000/api/update/1/
Make sure you are accepting requests to the port 8000 in your PC. Check your Firewall configuration if it is blocking any incoming requests to the 8000 port. If it is found blocking, then please allow an incoming request to the 8000 port using the following.
sudo ufw allow 8000/tcp
If there is nothing which is helping you, then please check your Android code to check if the API calling is okay. I would strongly recommend using Volley for API calls suggested in developers documentation.
Last, but not the least, please check if you have necessary permission in your AndroidManifest.xml file. You need to add the following permission to grant your application to use the internet.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
To be able to connect your localhost (I assume you are using emulator, I can edit the answer if not)
You need to use the following url:
http://10.0.2.2:8000/
Please run your django development server using the following command.
python manage.py runserver 0.0.0.0:8000
Once you get it running, in a new terminal window find out the ip address of your computer in your wifi/network subnet using the following command
Ipconfig or ifconfig (depends on your OS)
Then change the base url of your api from 127.0.0.1 to the ip you found in the above step. Now connect the android phone in which your app is being tested to your same wifi or network to which the computer running django is connected.
Now you can request and receive response.
127.0.0.1 is the home of your system, your android app will not be able to access that. You need to do it like this.
1)Andoird manifest to put internet permission and network acceess
2) if using Android simulator on local machine. Use 10.0.2.2. alias created by default for 127.0.0.1 i.e losthoast.
Its works for me
The API isn't working in POSTMAN I tried http://127.0.0.1:8000/api/update/1/ shows an error because it requires some params to be inputted.
in this case, http://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=8190df9eb51445228e397e4185311a66 the required params have been provided to the API, ie source, sortBy & apiKey
It is possible to call local api with some minor changes.These were the steps I did to hit the local django api from my android app.
You need to be connected to same network. Better create a hotspot from your pc or laptop and connect android with it
Create static IP from your system. If you are on VM you may require additional network adapter. Please google it as there are plenty of videos and blogs on the same.
Host django on the created local IP.
You are then good to go with your android app.
You can not access a local api outside from that local device. 127.0.0.1 is the local address of its own. If you want to access the api outside from local device, replace the ip with the ip that is open to outside. For example, 192.168.43.2 is a ip that is accessible from outside. Update your api with the accessible ip(use ifconfig or ipconfig in terminal to obtain the ip and use that ip to access from outsid?). Also, please make sure if you have proper permission in AndroidManifest.xml file.
For me, the problem was that my server was running on HTTP, not HTTPS. Once I set up my SSL certificate, everything worked fine. I'm using Expo and strangely the API works when in development mode through the Expo app, but after I build an APK it fails to connect to any non-HTTPS server.
In local host You must start the server and also do app development in same system then only it works for you..
There is no way of calling local APIs from android. Leave it.

Accessing Auto Proxy URL in Android?

My Android app uses curl to make network calls. I want to find out how I can get the URL that's present in the WiFi proxy auto config in an android device, inside of my application to actually be able to route the charles call through the proxy URL retrieved from the PAC file ?
This question is old, but this might be interesting for anyone else coming from search engines:
Do you know which URL the PAC resides on? If not, I would try to connect to the same WiFi with a PC and do a wireshark trace. When you initiate the connection to the WiFi, an option 252 is sent with the DHCP-lease, specifying where to download the PAC-file from. For example, your client might be told to download http://pac.yoursite.com/pac_file.txt - - - or simething like that.
Then, you can open a browser and navigate to that url, which will download the PAC-file for you to read as JavaScript.

My app can't connect to another app service if service was installed after client app

my app connects to another app service and transfer some data. i configure permissions in manifest file and everything works fine. but i i have a big problem. my app works and connect properly to that service if only installed after that service! if i first install my app and then install that service, i doesn't work and i get this error:
Not allowed to bind to service Intent
even i restart my phone it doesn't effect! what is the problem here?
This is a known (by design/won't fix) issue with custom permissions - you cannot use a custom permission if it is not known to the system at the time when your app is installed.
Since the custom permission is defined in the manifest of the service apk which hasn't yet been installed, the system doesn't know about it when setting up the actual permissions of your client app, so it is effectively filtered out.
You will need to either get your users to install the service apk before the client, or else use some other scheme than a custom permission. For example, you might be able to do something by allowing any app to talk to you, but only responding to those with a key of some sort (though keys can be extracted by reverse engineering...)

How to access Android from browser

I have seen a few applications recently called lazyview and airdroid on Android, that connect via wireless to any browser, using local ip address and port. The things they access can be applications, battery view, basically most settings including video photos etc, not just the file structures. Does anyone know how this is done, or if there is any open source code that can do this.
You need to build a webserver in your application. For example: Tiny Java Webserver, i-jetty

Categories

Resources