Advanced USSD automation for React Native Android - Multi-session support, accessibility service integration, and dual SIM support
npm install react-native-ussd-advancedAdvanced USSD automation for React Native Android - The React Native equivalent of Flutter's ussd_advanced
- ✅ Multi-session USSD with automatic dialog handling
- ✅ Accessibility Service integration for reading responses
- ✅ Dual SIM support - Select which SIM to use
- ✅ Retry logic with configurable attempts
- ✅ Event-driven architecture with real-time callbacks
- ✅ Full automation - Send multiple messages in sequence
- ✅ TypeScript - Full type safety included
- ✅ MIUI support - Enhanced detection for Xiaomi devices
``bash`
npm install react-native-ussd-advanced
or
`bash`
yarn add react-native-ussd-advanced
If you're using Expo, the setup is automatic! Just add the plugin to your app.json or app.config.js:
`json`
{
"expo": {
"plugins": [
"react-native-ussd-advanced"
]
}
}
Then rebuild your app:
`bash`
npx expo prebuildor
npx expo run:android
The Expo plugin will automatically:
- ✅ Add required Android permissions (CALL_PHONE, READ_PHONE_STATE)
- ✅ Configure the accessibility service
- ✅ Copy necessary XML resource files
Note: Make sure you have @expo/config-plugins installed in your Expo project (it's usually included by default).
If you're using a bare React Native project (not Expo), follow these manual setup steps:
`xml`
Inside tag in android/app/src/main/AndroidManifest.xml:
`xml`
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="false">
android:resource="@xml/ussd_service" />
Note: Expo users can skip this entire section as the plugin handles everything automatically.
`typescript
import UssdAdvanced from 'react-native-ussd-advanced';
await UssdAdvanced.sendUssd('*123#', -1);
`
`typescript`
const response = await UssdAdvanced.sendAdvancedUssd('123143#', -1);
console.log(response);
`typescript
const initialResponse = await UssdAdvanced.multisessionUssd('*170#', -1);
console.log(initialResponse);
const nextResponse = await UssdAdvanced.sendMessage('1');
console.log(nextResponse);
await UssdAdvanced.cancelSession();
`
`typescript
import { useUssd } from 'react-native-ussd-advanced';
function MyComponent() {
const {
runFullUssdSession,
isSessionActive,
currentResponse,
isAccessibilityEnabled,
} = useUssd({
onUssdResponse: (response) => console.log('Response:', response),
onUssdError: (error) => console.error('Error:', error),
onSessionEnd: (message) => console.log('Session ended:', message),
});
const handleUssd = async () => {
const result = await runFullUssdSession('123123#', 0);
};
return (
);
}
`
`typescript
import { parseUssdCode } from 'react-native-ussd-advanced';
const { code, messages } = parseUssdCode('123123#');
console.log(code);
console.log(messages);
`
#### sendUssd(code: string, subscriptionId?: number): Promise
Basic USSD without response.
#### sendAdvancedUssd(code: string, subscriptionId?: number): Promise
Single session with response (Android 8+).
#### multisessionUssd(code: string, subscriptionId?: number): Promise
Start multi-session USSD.
#### sendMessage(text: string): Promise
Send response in active session.
#### cancelSession(): Promise
Cancel active USSD session.
#### isAccessibilityEnabled(): Promise
Check if accessibility service is enabled.
#### openAccessibilitySettings(): Promise
Open accessibility settings.
#### getDeviceInfo(): Promise
Get device information (useful for MIUI detection).
#### parseUssdCode(fullCode: string): { code: string; messages: string[] }
Parse complex USSD codes into base code and messages.
Use subscriptionId parameter:-1
- : Default SIM (system setting)0
- : First SIM1`: Second SIM
-
For Xiaomi devices, users need to:
1. Enable accessibility service
2. Disable battery optimization for your app
3. Enable autostart permission
MIT
Inspired by Flutter's ussd_advanced package.