├── .github └── workflows │ └── android.yml ├── .gitmodules ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── jvdegithub │ │ └── aiscatcher │ │ ├── AisCatcherJava.java │ │ ├── AisService.java │ │ ├── DeviceManager.java │ │ ├── LocationHelper.java │ │ ├── MainActivity.java │ │ ├── Settings.java │ │ ├── tools │ │ ├── InputFilterIP.java │ │ ├── InputFilterMinMax.java │ │ └── LogBook.java │ │ └── ui │ │ └── main │ │ ├── StatisticsFragment.java │ │ └── WebViewMapFragment.java │ ├── jni │ ├── CMakeLists.txt │ └── JNI │ │ └── AIScatcherNDK.cpp │ └── res │ ├── color │ └── bottom_navigation_colors.xml │ ├── drawable-anydpi-v24 │ └── ic_notif_launcher.xml │ ├── drawable-hdpi │ └── ic_notif_launcher.png │ ├── drawable-mdpi │ └── ic_notif_launcher.png │ ├── drawable-xhdpi │ └── ic_notif_launcher.png │ ├── drawable-xxhdpi │ └── ic_notif_launcher.png │ ├── drawable │ ├── ic_baseline_clear_40.xml │ ├── ic_baseline_content_copy_24.xml │ ├── ic_baseline_input_40.xml │ ├── ic_baseline_play_circle_filled_40.xml │ ├── ic_baseline_settings_24.xml │ ├── ic_baseline_stop_circle_40.xml │ ├── ic_baseline_web_asset_24.xml │ ├── ic_launcher_background.xml │ ├── ic_launcher_foreground.xml │ └── logo.xml │ ├── layout │ ├── activity_main.xml │ ├── fragment_log.xml │ ├── fragment_map.xml │ ├── fragment_nmealog.xml │ └── fragment_statistics.xml │ ├── menu │ ├── bottom_menu.xml │ └── toolbar_menu.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values-land │ └── dimens.xml │ ├── values-night │ └── themes.xml │ ├── values-w1240dp │ └── dimens.xml │ ├── values-w600dp │ └── dimens.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── arrays.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ ├── data_extraction_rules.xml │ ├── network_security_config.xml │ ├── preferences.xml │ ├── tool_bar.xml │ └── usb_device_filter.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | 9 | jobs: 10 | apk: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout repository and submodules 16 | uses: actions/checkout@v3 17 | with: 18 | submodules: recursive 19 | 20 | - name: set up JDK 17 21 | uses: actions/setup-java@v3 22 | with: 23 | java-version: '17' 24 | distribution: 'temurin' 25 | cache: gradle 26 | 27 | - name: Setup Android SDK 28 | uses: android-actions/setup-android@v3 29 | 30 | - name: Install Ninja and check Android SDK 31 | run: | 32 | sudo apt-get update 33 | sudo apt-get install -y ninja-build 34 | 35 | - name: Set permissions for gradlew 36 | run: chmod +x gradlew 37 | 38 | - name: Check Android SDK Details 39 | run: | 40 | echo "SDK Location:" 41 | echo $ANDROID_SDK_ROOT 42 | echo "Build Tools:" 43 | ls -la $ANDROID_SDK_ROOT/build-tools/ 44 | echo "Platform Tools:" 45 | ls -la $ANDROID_SDK_ROOT/platform-tools/ 46 | echo "NDK versions:" 47 | ls -la $ANDROID_SDK_ROOT/ndk/ 48 | 49 | - name: Build 50 | run: ./gradlew build 51 | 52 | - uses: ilharp/sign-android-release@v1 53 | name: Sign app APK 54 | # ID used to access action output 55 | id: sign_app 56 | with: 57 | releaseDir: app/build/outputs/apk/release 58 | signingKey: ${{ secrets.SIGNING_KEY }} 59 | keyAlias: ${{ secrets.ALIAS }} 60 | keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} 61 | keyPassword: ${{ secrets.KEY_PASSWORD }} 62 | buildToolsVersion: 34.0.0 63 | 64 | - name: Upload Debug APK 65 | uses: actions/upload-artifact@v4 66 | with: 67 | name: debug-apk 68 | path: app/build/outputs/apk/debug/app-debug.apk 69 | 70 | - name: Upload Release APK 71 | uses: actions/upload-artifact@v4 72 | with: 73 | name: release-apk 74 | path: ${{steps.sign_app.outputs.signedFile}} 75 | 76 | - name: Upload to Edge relaese 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 79 | run: | 80 | gh release upload Edge app/build/outputs/apk/debug/app-debug.apk --clobber 81 | gh release upload Edge ${{steps.sign_app.outputs.signedFile}} --clobber 82 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "app/src/main/jni/libusb"] 2 | path = app/src/main/jni/libusb 3 | url = https://github.com/libusb/libusb.git 4 | [submodule "app/src/main/jni/AIS-catcher"] 5 | path = app/src/main/jni/AIS-catcher 6 | url = https://github.com/jvde-github/AIS-catcher.git 7 | [submodule "app/src/main/jni/rtl-sdr"] 8 | path = app/src/main/jni/rtl-sdr 9 | url = https://github.com/jvde-github/rtl-sdr.git 10 | [submodule "app/src/main/jni/airspyone_host"] 11 | path = app/src/main/jni/airspyone_host 12 | url = https://github.com/jvde-github/airspyone_host.git 13 | [submodule "app/src/main/jni/airspyhf"] 14 | path = app/src/main/jni/airspyhf 15 | url = https://github.com/jvde-github/airspyhf.git 16 | [submodule "app/src/main/assets/webassets"] 17 | path = app/src/main/assets/webassets 18 | url = https://github.com/jvde-github/webassets.git 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AIS-catcher for Android - A multi-platform AIS receiver 2 | This Android App helps to change your Android device into a dual channel AIS receiver that can be used to pick up AIS signals from nearby vessels, even if offline! 3 | The App directly accesses a Software Defined Radio USB device, like a RTL-SDR dongle or an AirSpy decvice. Received vessels are visualized on the built-in map or messages are sent via UDP to plotting Apps like [Boat Beacon](https://pocketmariner.com/mobile-apps/boatbeacon/) or [OpenCPN](https://play.google.com/store/apps/details?id=org.opencpn.opencpn_free). A lightweight AIS receiver system when travelling. AIS-catcher for Android has been tested on an Odroid running Android. 4 | 5 | An impression of AIS-catcher on the beach on a Galaxy Note 20 in July 2023 (thanks and credit: Roger G7RUH) 6 |
7 |
8 |
9 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
38 |
70 |
71 |
78 |
79 |
86 |
87 |
95 |
96 |
104 |
105 |
113 |
114 |
122 |
123 |
124 |
125 |
126 |
5 | * libusb-1.0.26
6 | https://github.com/libusb/libusb
7 | libusb is a library for USB device access from Linux, macOS, Windows, OpenBSD/NetBSD, Haiku and Solaris userspace. It is written in C (Haiku backend in C++) and licensed under the GNU Lesser General Public License version 2.1 or, at your option, any later version (see COPYING).
8 |
9 | * rtl-sdr
10 | https://github.com/osmocom/rtl-sdr 11 | Turns your Realtek RTL2832 based DVB dongle into a SDR receiver. Licensed under the GPL-2.0 license. 12 | Modified for Android to open devices with file descriptors: https://github.com/jvde-github/rtl-sdr
13 |
14 | * airspyhf
15 | https://github.com/airspy/airspyhf
16 | This repository contains host software (Linux/Windows) for Airspy HF+, a high performance software defined radio for the HF and VHF bands. Licensed under the BSD-3-Clause license.
17 | Modified for Android to open devices with file descriptors: https://github.com/jvde-github/airspyhf
18 |
19 | * airspyone_host
20 | https://github.com/airspy/airspyone_host
21 | AirSpy usemode driver and associated tools
22 | https://github.com/jvde-github/airspyone_host
23 |
24 | * AIS-catcher
25 | https://github.com/jvde-github/AIS-catcher
26 | AIS receiver for RTL SDR dongles, Airspy R2, Airspy Mini, Airspy HF+, HackRF and SDRplay. Licensed under the GPGL v3.0 license.
27 | ]]>
40 | This program is free software: you can redistribute it and/or modify 41 | it under the terms of the GNU General Public License as published by 42 | the Free Software Foundation, either version 3 of the License, or 43 | (at your option) any later version.
44 | This program is distributed in the hope that it will be useful, 45 | but WITHOUT ANY WARRANTY; without even the implied warranty of 46 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 47 | GNU General Public License for more details. 48 |
49 | You should have received a copy of the GNU General Public License 50 | along with this program. If not, see https://www.gnu.org/licenses/. 51 |
52 | It is a hobby project and not tested and designed for reliability and correctness. You can play with the software but it is the user responsibility to use it prudently. 53 | So, DO NOT rely upon this software in any way including for navigation and/or safety of life or property purposes.
54 | There are variations in the legislation concerning radio reception in the different administrations around the world. 55 | It is your responsibility to determine whether or not your local administration permits the reception and handling of AIS messages from ships and you can have this App on your phone. 56 | It is specifically forbidden to use this software for any illegal purpose whatsoever. It is intended for use only in those regions where such use is permitted.
57 | ]]> 58 |