آموزش خواندن نتایج ussd بدون نمایش آن
سلام دوستان در این سری از آموزش های برنامه نویسی اندروید به خواندن نتایج ussd بدون نمایش آن می پردازیم این آموزش به علت درخواست یکی از کاربران در سایت قرار گرفته است.
برای اینکار ما ابتدا باید یک سروریسی درست کنیم نام آن سرویس را برابر با USSDService است پس کلاسی با این نام درست کرده کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | public class USSDService extends AccessibilityService { public static String TAG = USSDService.class.getSimpleName(); @Override public void onAccessibilityEvent(AccessibilityEvent event) { Log.d(TAG, "onAccessibilityEvent"); AccessibilityNodeInfo source = event.getSource(); /* if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !event.getClassName().equals("android.app.AlertDialog")) { // android.app.AlertDialog is the standard but not for all phones */ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !String.valueOf(event.getClassName()).contains("AlertDialog")) { return; } if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && (source == null || !source.getClassName().equals("android.widget.TextView"))) { return; } if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && TextUtils.isEmpty(source.getText())) { return; } List<CharSequence> eventText; if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { eventText = event.getText(); } else { eventText = Collections.singletonList(source.getText()); } String text = processUSSDText(eventText); if( TextUtils.isEmpty(text) ) return; // Close dialog performGlobalAction(GLOBAL_ACTION_BACK); // This works on 4.1+ only Log.d(TAG, text); // Handle USSD response here } private String processUSSDText(List<CharSequence> eventText) { for (CharSequence s : eventText) { String text = String.valueOf(s); // Return text if text is the expected ussd response if( true ) { return text; } } return null; } @Override public void onInterrupt() { } @Override protected void onServiceConnected() { super.onServiceConnected(); Log.d(TAG, "onServiceConnected"); AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.flags = AccessibilityServiceInfo.DEFAULT; info.packageNames = new String[]{"com.android.phone"}; info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; setServiceInfo(info); } } |
سپس سرویس ایجاد شده در باید در AndroidManifest.xml تعریف کنیم
1 2 3 4 5 6 7 | <service android:name=".USSDService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/ussd_service" /> |
حال باید یک فایل Xml ایجاد کنیم به نام ussd_service همانند زیر
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:description="@string/accessibility_service_description" android:notificationTimeout="0" android:packageNames="com.android.phone" /> |
بعد از نصب کردن اپلیکیشن باید به منوی Accessibility Setting رفته و اپ خود را انتخاب کنید.
این آموزش هم به پایان رسید
موفق باشید.
عالیه مرسی
خواهش می کنم
سلام ممنون از آموزش خوبتون
ببخشید الان که ما این کد ها رو وارد کردیم، چطور کد ussd رو بگیریم؟
منظورتون برگشتشه ؟
براش متغییر گذاشتیم دقیق نگاه کنید
منظورم اینه که باید کد رو توی کدوم متغیر باید بذاریم تا شماره گیری بشه؟
یه چیز دیگهandroid:description=”@string/accessibility_service_description” چیه؟
سلام و درود
دوست عزیز نمی دونم در بخش سئو اپلیکیشن برای store های مختلف کار کرده ای یا خیر این گزینه برای آن است ! بله سئو اپلیکیشن شاید اولین برای باشد که در ایران شنیده باشید.
موفق باشید در صورتی که خطا دارید آن را حذف کنید یا یک رشته با نام accessibility_service_description در string.xml ایجاد کنید
وقتی توی گوشی وارد می کنید نتیجه اش در متغییر text ذخیره میشه
سلام آقای جعفری پور،
بابت پاسخ سریع و آموزش تشریحیتون متشکرم و ممنون که زحمت کشیدید یک مطلب در این باره ایجاد کردید.
می خواستم بپرسم آیا امکان انجام این کار در Xamarin.Android هم هست یا خیر؟ اگر هست، ممنون میشم توضیح بفرمایید چه تفاوتی با این کد خواهد داشت
با سپاس فراوان،
پیروز باشید
سلام دوست عزیز من که سرچ کردم چیزی پیدا نکردم یعنی خود سایت رسمی هم چیز نگذاشته بود
شما بهتره به لینک زیر برید نحوه استفاده از کلاس های جاوا رو در Xamarin گفته است. موفق باشید.
https://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/porting_java_to_csharp/
سلام،ممنون از آموزش خوب شما
من کد هارو کامل پیاده کردم اما توی منوی accessibility اپلیکیشن رو نشون نمیده اصلا برای فعال سازی
ممنون میشم راهنمایی بفرمایید.
سلام برنامه تست شده مشکلی ندارد یک بار دیگه بررسی کنید حتما خطایی دارید
سلام مجدد
اگر فایل xml رو در یک زیرپوشه xml درون تگ resources بذاریم مشکلی نیست؟یا به طور دیگه ای باید عمل کرد؟
سلام،مشکل حل شد
با تشکر از شما
خواهش می کنم
موفق و موید باشید.
به مشکلی نمی خورید ولی ممکن است اندروید استودیو به مشکل بخورد.
باسلام
ببخشید ، برنامه به خوبی اجرا میشه
اما فقط مقدار Phone رو درون متغیر برگشت میده!
مشکلش از کجاست؟
سلام مقدار در متغیر text می رود تمامی داده است و دقت کنید فقط بروی اندروید 4 به بالا این کد جواب میدهد
خیلی عالی بود، شیوه بیانتون عالیه مرسی
خواهش می کنم.
عالی بود مرسی
خواهش می کنم.
خیلی عالیه مرسی.من برنامه رو اجرا کردم به خوبی کار کرد ولی کل نتایج ussd گوشی رو میخونه نمیشه فقط روی خودش تنظیمش کرد؟؟(فقط نتایج ussd که خودش اجرا میکنه رو بتونه بخونه).
سلام خیر باید خودتون شرط براش بزارید.
سلام ، امکانش هست که دیالوگ خود سیستم جلو نمایششو بگیریم؟
سلام و درود
در این آموزش همین کار انجام داده شده است.
من دقیقا این کدی که در آموزش گذاشتید رو تو یک پروژه خام بردم و لاگ رفتم درست نوشته ussd میداد ولی دیالوگ خود سیستم نمایش داده میشد ، امکانس هست اون دیالوگ خود سیستم نمایش داده نشه؟
سلام و درود
به لینک زیر یک نگاهی بندازید.
https://stackoverflow.com/questions/22057625/prevent-ussd-dialog-and-read-ussd-response
باید حواب بده.
موفق و پیروز باشید.
سلام خسته نباشی
من توی قسمت xml ارور داده توی این قسمت از کد :
<accessibility-service
اینو نمیشناسه
چیکار باید بکنم ؟
کتابخونه ای چیزی باید ادد کنم ؟
سلام
تشکر بابت آموزشتون.
من در حال حاضر ریسپانس رو دریافت میکنم اما یه سوالی دارم.
چجوری میشه ریسپانسی که دریافت شده رو در کلاس های دیگه استفاده کرد؟
در حال حاضر من در کلاس دیگای می خوام با اعمال شروطی برروی ریسپانس دریافت شده از ussd یکسری کارا رو انجام بدم اما چون تابع void است نمیتونم از داده دریافت شده استفاده کنم…