Creating your own taxi application on Android is an ambitious task that can bring both financial benefits and valuable experience in the development of mobile services. Unlike standard applications, a taxi service requires complex infrastructure: from geolocation and routing to payment processing and driver management. But with the right approach, even a beginner with basic programming knowledge will be able to implement a working prototype.
In this article we will analyze the entire process - from planning functionality to publication in Google Play. You will learn what technologies to use for frontend and backend, how to integrate cards and payments, and also avoid typical mistakes of novice developers. We will pay special attention to bypassing Google restrictions on applications with geolocation in the backgroundwhich often block such services at the moderation stage.
It is important to understand: full-fledged analogue Uber or Yandex.Taxi alone - this requires a team of specialists. But a minimum viable product (MVP) with basic functionality is quite possible. Ready to get started?
1. Planning: what functionality does a taxi application need?
Before writing code, decide on target audience key functions. The minimum set for MVP includes:
- ๐ Geolocation and display of nearby drivers on the map
- ๐ Possibility of ordering a trip indicating points A and B
- ๐ณ Integration of payments (cash or online)
- ๐ฑ Notifications about order status (accepted, driver on the way, trip completed)
- ๐ค User and driver profiles with ratings
Additional functions for expansion:
- ๐ Pre-order (for a certain time)
- ๐ Selecting a car class (economy, comfort, business)
- ๐ฌ Chat between passenger and driver
- ๐ Travel history and receipts
- ๐ Promotional codes and bonus system
Decide whether you will have a separate application for drivers or one universal interface. The first option is more difficult to develop, but more convenient for users. Also decide whether a web version is needed for administration (tariff management, driver moderation, etc.).
โ ๏ธ Attention: If you plan to work with real drivers and passengers, make sure that your service complies with local transportation laws. In some countries, a taxi license is required to operate legally.
2. Choosing a technology stack: what to use for development?
For Androidapplications there are two main approaches:
- Native development on Kotlin/Java - provides maximum performance and access to all functions of the device, but requires deep knowledge.
- Cross-platform development on Flutter or React Native โfaster in implementation, but may be inferior in optimization.
For the backend, they are popular:
- ๐ฅ Firebase โsuitable for MVP (authorization, databases, notifications)
- ๐ Node.js + MongoDB/PostgreSQL โ for more complex systems
- ๐ Python (Django/Flask) โ if you need analytics and machine learning (for example, to predict demand)
For working with maps and geolocation:
- ๐บ๏ธ Google Maps API โ paid, but the most functional option
- ๐ OpenStreetMap + Mapbox โ free alternative
- ๐ Fused Location Provider (for Android) - for precise location determination
| Component | Technology | Pros | Cons |
|---|---|---|---|
| Frontend (Android). fast development | Kotlin (native) | Maximum performance, full access to the Android API | It takes longer to develop, you need deep knowledge |
| Frontend (cross platform) | Flutter | One code for Android and iOS, fast development | There may be performance issues with complex animations |
| Backend | Firebase | Serverless solution, fast deployment | Limitations on complex queries, expensive at scale |
| Maps | Google Maps API | Accurate data, routing support | Paid use under high load |
For beginners, we recommend the combination: Flutter (frontend) + Firebase (backend) + Google Maps API (maps). This will allow you to quickly create a working prototype without deep knowledge in backend development.
3. Interface development: design and user experience
The design of a taxi application should be intuitive. Main screens:
- Authorization/registration screen โlogin by phone number or email.
- Main screen with map โdisplaying the user's location and nearby drivers.
- Order screen โselecting points route, car type, options (child seat, etc.).
- Trip screen โ driver information, route, cost, cancel button.
- User profile โ trip history, payment information, settings.
Follow the principles Material Design for Android:
- Use standard components (BottomNavigationView, RecyclerView).
- Minimize the number of steps for ordering (no more than 3 clicks from opening to confirming the trip).
- Make the buttons large (at least 48x48 dp) for easy pressing on the go.
Use a color scheme associated with transport (blue, green, orange)
Make the "Order a taxi" button visible and accessible from the main screen
Show the estimated cost of the trip before confirming the order
Add a loading indicator when searching for a driver
Provide a dark theme for night use-->
To prototype the interface, use Figma or Adobe XD. Ready-made UI kits for taxi applications can be found at UI8 or Dribbble.
โ ๏ธ Attention: Avoid overloaded screens with dozens of buttons. The user should see only the information he needs at the moment (for example, at the order stage, hide the details of the driverโs profile).
4. Implementation of key functions: geolocation, routing, payments
The most complex technical tasks in a taxi application are working with geodata and processing payments. Let's look at them step by step.
4.1. Geolocation and driver tracking
To determine the location, use FusedLocationProviderClient in Android:
// Example of a location request in Kotlinval fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
fusedLocationClient.lastLocation
.addOnSuccessListener { location ->
// We use location.latitude and location.longitude coordinates
}
For displaying drivers on the map:
- Receive the coordinates of drivers from the server in real time (via WebSocket or Firebase Realtime Database).
- Update the position of markers on the map every 2-3 seconds.
- Use
Marker.clusteringfor grouping markers with a large number of drivers.
4.2. Building a route and calculating the cost
For routing, use Google Directions API:
// Request to the API to build a routeval url = "https://maps.googleapis.com/maps/api/directions/json?" +
"origin=${startLat},${startLng}&" +
"destination=${endLat},${endLng}&" +
"key=YOUR_API_KEY"
Calculate the cost of the trip using the formula:
Price = (Basic tariff) + (Distance ร Coefficient per km) + (Time in traffic ร Coefficient per minute) + (Additional options)
Store tariffs on the server to easily update them without releasing a new version of the application.
4.3. payments
Payment options:
- ๐ต Cash - the easiest to implement, but inconvenient for users.
- ๐ณ Bank cards - through Stripe, YooKassa or Google Pay API.
- ๐ฑ Mobile payments โ Apple Pay, Samsung Pay.
Integration example Stripe:
// Initializing Stripe in Androidval stripe = Stripe(context, "pk_test_your_publishable_key")
val paymentIntentClientSecret = "pi_123_secret_456"
stripe.confirmPayment(this, paymentIntentClientSecret)
To test payments, use test cards from Stripe (for example, 4242 4242 4242 4242). This will allow you to test the payment logic without real charges.
โ ๏ธ Attention: Storing bank card data on your server requires compliance with the standard PCI DSS. It is better to use tokenization through payment gateways.
5. Backend: server part and databases
The server part must process:
- ๐ฑ Registration and authentication of users
- ๐ Registration and verification of drivers
- ๐ Exchange of geodata in real life time
- ๐ฐ Cost calculation and payment processing
- ๐ Storing travel history and generating receipts
An example of a database structure (for Firebase Realtime Database):
{"users": {
"userId1": {
"name": "Ivan Ivanov",
"phone": "+79001234567",
"rating": 4.8,
"trips": ["tripId1", "tripId2"]
}
},
"drivers": {
"driverId1": {
"name": "Peter Petrov",
"car": "Toyota Camry, A123BV",
"location": { "lat": 55.75, "lng": 37.62 },
"status": "free"
}
},
"trips": {
"tripId1": {
"userId": "userId1",
"driverId": "driverId1",
"start": { "lat": 55.75, "lng": 37.62 },
"end": { "lat": 55.76, "lng": 37.63 },
"status": "completed",
"price": 250,
"timestamp": 1634567890
}
}
}
To process orders in real time, use:
- WebSocket โ to instantly notify drivers about new orders.
- Firebase Cloud Functions โ for triggers (for example, calculating the cost after completing a trip).
- Geohashing โ for an effective search for nearby drivers (we divide the map into cells and look for drivers only in adjacent cells).
Example of driver search logic:
- The user clicks "Order" taxi."
- The server receives the user's coordinates and searches for available drivers within a radius of 2-5 km.
- Drivers are sent a notification with an offer to accept the order.
- The first driver to accept receives data about the trip, the rest are sent a cancellation.
6. Testing and optimization before release
Before publishing in Google Play conduct several types of testing:
- ๐ฑ Functional testing - checking all buttons, screens and scenarios (successful order, cancellation, payment, etc.).
- ๐ Geolocation testing โ checking operation in different cities, with a weak GPS signal.
- ๐ณ Testing payments โpayment with test cards, error handling (insufficient funds, expired card).
- ๐ก Testing notifications โpush notifications should arrive even when the application is closed.
- ๐ Testing consumption batteries โconstant operation of GPS and the Internet should not drain the phone too much.
Testing tools:
- Android Studio Profiler โ for analyzing memory and CPU consumption.
- Firebase Test Lab โ for testing on different devices.
- Postman โ for checking API requests.
Optimize:
- ๐บ๏ธ Maps โ cache map tiles to reduce traffic.
- ๐ก Network requests โuse pagination for travel history.
- ๐ Geolocation โ reduce the frequency of updates when the application is in the background.
How to test geolocation without going outside?
Use a GPS emulator in Android Studio:
1. Open Extended Controls in the emulator.
2. Go to tab Location.
3. Upload a GPX file with the route or enter the coordinates manually.
4. Click Playto simulate the movement.
This will allow you to test route display and cost calculations without actually driving.
โ ๏ธ Attention: Google blocks applications that request access to geolocation in the background without a good reason. In the manifest (AndroidManifest.xml), indicateandroid:usesPermission="android.permission.ACCESS_BACKGROUND_LOCATION"and explain in the application description why this is needed (for example, โto track a trip in real timeโ).
7. Publishing on Google Play and promotion
To publish an application in Google Play, follow the steps:
- Create a developer account (Google Play Console) and pay for registration ($25 one time).
- Prepare icon (512ร512 px), screenshots (minimum 2, better 5-6) and promo graphics (1024ร500 px).
- Write name (up to 50 characters) and description (up to 4000 characters) with keywords ("taxi", "order a car", "cheap taxi", etc.).
- Download
APKorAABfile (recommended Android App Bundle). - Fill out the privacy form (indicate what data you collect and how you use it).
- Indicate category ("Transport") and age rating.
- Pay for publication and wait for moderation (usually 1-3 days).
For promotion:
- ๐ข Social networks โ create pages in VK, Instagram, Telegram.
- ๐ฏ Targeted advertising โ set up campaigns in Google Ads i Yandex.Direct.
- ๐ค Partnerships โagree with cafes, hotels or airports to place your leaflets.
- ๐ฐ Bonus app โoffer discounts for first trips or inviting friends.
The cost of attracting one user through advertising can range from 50 to 300 rubles. To recoup the costs, an average trip must bring in at least. 200-400 rubles profit (minus commission to the driver and payment systems).
The main factor of success at the start is the availability of drivers. Without them, users will not be able to order a trip and will delete the application. Start with a small city or region, where you can personally negotiate with 10-20 drivers.
8. Monetization and development of the project. data-i="257">Main monetization models:
Main monetization models:
- ๐ต Commission on trips โ 10-30% of the cost (industry standard).
- ๐ Paid subscription for drivers โfixed monthly fee for access to orders.
- ๐ Advertising in the application โbanners from partners (cafes, car services).
- ๐ Premium functions โfor example, ordering a car of a certain brand for an additional fee.
Development plan for the first 6 months:
| Month | Tasks | Success metrics |
|---|---|---|
| 1 | Launch MVP, attracting the first 50 drivers and 200 users | 10 trips per day |
| 2-3 | Adding online payment, referral bonus system | 50 trips per day, 20% growth in users |
| 4-6 | Expansion to a neighboring city, integration with booking services (hotels, airports) | 200 trips per day, reaching self-sufficiency |
To scale you will need:
- ๐ Analytics โ integrate Google Analytics or Amplitudeto track user behavior.
- ๐ค Automation - bots to support users (for example, in Telegram).
- ๐ก๏ธ Security - protection from fraudsters (checking phone numbers, limit on the number of orders from one account).
Consider the possibility of attracting investments if the project shows stable growth. Investors in taxi services usually look at:
- ๐ Growth rate in the number of trips (minimum 20% per month).
- ๐ฐ Average check and margin per one trips.
- ๐ Number of active drivers and their retention.
FAQ: Frequently asked questions about creating a taxi application
How much does it cost to create a taxi application from scratch?
The cost depends on the approach:
- Independent development - only costs for hosting and API (from 5,000 rubles/month).
- Outsource development โ from 500,000 rubles for MVP (frontend + backend + cards).
- A full-fledged clone of Uber โ from 3,000,000 rubles (with a team of 5+ specialists).
Main expenses: servers, Google Maps API (from $0.5 per 1000 requests), SMS verification (from 1 rub/SMS), support.
Do I need a taxi license to launch the application?
Yes, in most regions of Russia for legal taxi operation the following is required:
- License for transportation (for legal entities or individual entrepreneurs).
- Agreements with drivers (or their registration as individual entrepreneurs).
- Passenger insurance (OSAGO + additional).
Without a license, you risk receiving fines (up to 50,000 rubles for legal entities) and blocking the application. Start by consulting a lawyer.
How to avoid blocking an application on Google Play?
Google often blocks taxi applications for:
- Illegal use of geolocation in the background (clear justification in the manifest is required).
- Lack of a privacy policy (be sure to indicate how you store user data).
- Violation of payment rules (if you accept payments not through Google Play Billing).
Solution: before publishing, check the application for compliance Google Play rules and test on a closed track.
Is it possible to make a taxi application without a server part?
Technically yes, but with serious limitations:
- Use Firebase Realtime Database to store data.
- For geolocation - Geofirestore (add-on for Firestore for geo-queries).
- Payments - only in cash or through third-party services (Yoomoney).
Disadvantages: low performance as users grow, difficult to add new features, high risks of data loss.
What alternatives to the Google Maps API can be used?
If Google Maps too expensive (prices start at $0.5 for 1000 map downloads), consider:
- Mapbox - flexible customization of map design, free up to 50,000 downloads/month.
- OpenStreetMap + Leaflet - completely free, but requires more effort for integration.
- Yandex Maps API - cheaper than Google for Russia, but less accurate abroad.
- 2GIS Maps API - good for working in Russia and CIS.
For routing you can use OSRM (free analogue Google Directions API).