2010-11-16 41 views
16

Tôi muốn viết tiện ích hiển thị số dư trả trước của người dùng, dữ liệu còn lại, v.v.Gọi (và nhận phản hồi) Mã USSD, trong nền?

Tôi đang tự động gọi mã USSD trả về dữ liệu này (sẽ phải có regex cho mỗi mạng) , trong khoảng thời gian (không thường xuyên, để tiết kiệm pin). Điều này sẽ phải được thực hiện trong nền. Tôi có một ứng dụng tại thời điểm này chạy mã ussd và trả về kết quả, vì vậy tôi nghĩ rằng điều này sẽ là có thể - nhưng tôi không chắc chắn làm thế nào nó sẽ được thực hiện trong nền.

Tôi đã nhìn thấy ý định gọi cho một số, nhưng tôi không chắc chắn làm thế nào để có được kết quả, và tôi cũng nghĩ rằng ý định đó sẽ làm cho màn hình gọi để đi lên phía trước?

Tùy chọn khác là lấy dữ liệu bằng cách quét màn hình từ trang web của nhà cung cấp dịch vụ/có thể là wap trang nhưng điều đó sẽ dẫn đến phí dữ liệu cho người dùng, vì vậy tôi thích giải pháp sử dụng mã USSD.

Cảm ơn trước sự giúp đỡ nào - chỉ bắt đầu làm việc trên sự hiểu biết android ngày hôm nay để nhận được khá nhiều để học hỏi :)

+0

Tôi thậm chí không chắc chắn Nếu tôi có thể thực hiện cuộc gọi từ dịch vụ - tôi đã cố tạo mục đích ACTION.CALL và gửi nó bằng startActivity(), nhưng điều này gây ra một lực gần, ngay cả khi tôi đặt cờ FLAG_ACTIVITY_NEW_TASK . – Jords

+0

Ngớ ngẩn tôi, Chỉ cần không có quyền phù hợp. Nó thực sự gọi mã USSD bây giờ - nhưng không phải trong nền. Tôi đoán bạn không thể thực hiện một cuộc gọi android mà không có trình quay số hiển thị giao diện của nó - sẽ phải đi với tùy chọn web tôi nghĩ. – Jords

+0

Hi Jords, tôi thấy câu hỏi này đã được hỏi 2 năm trước vì vậy tôi hy vọng mọi thứ đã thay đổi kể từ đó. Tôi đang viết ứng dụng tương tự (như là một phần của văn bằng của tôi). Bạn có thể vui lòng giúp tôi với nhiệm vụ USSD. Cũng giống như bạn tôi cần phải thực hiện một cuộc gọi USSD và nhận được kết quả (trong nền nếu có thể) ... Tôi sẽ đánh giá cao nếu bạn chia sẻ một số mã làm việc về điều này. Cảm ơn – vach

Trả lời

13

USSD chưa được hỗ trợ trên Android. Có một yêu cầu tính năng cho nó: http://code.google.com/p/android/issues/detail?id=1285

+0

Cảm ơn, đây không phải là câu trả lời chính xác mà tôi đã đề cập nhưng trả lời câu hỏi của tôi ít nhất và hy vọng nó sẽ có trong Gingerbread. Tôi ngạc nhiên vì tôi không bao giờ thấy rằng từ việc tìm kiếm của tôi! – Jords

+0

Và chúng tôi vẫn không có nó – gkiko

+0

Nhìn vào câu trả lời từ Picaso và Agarwal Shankar, bây giờ có thể – Musa

7

Bạn có thể sử dụng đoạn mã sau để gọi các mã USSD trên điện thoại android để kiểm tra số dư và vv ......

String s=calledittext.getText.toString();//calledittext is editText on the 
    //screen from which can get the number 
      if((s.startsWith("*"))&&(s.endsWith("#"))){ 
      //if true then it is a USSD call---- 
      callstring=s.substring(0, s.length()-1); 
      callstring=callstring+Uri.encode("#"); 

    Log.d("CALL TYPE---------->", "USSD CALL"); 
     }else{ 
      callstring=s; 
    Log.d("CALL TYPE---------->", "Not a USSD CALL"); 
    //Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+output.getText().toString())); 
    //startActivity(i); 
     } 
    Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+callstring)); 
    startActivity(i); 
5

Tôi không hoàn toàn chắc chắn nhưng tôi nghĩ USSD chưa được hỗ trợ trên Android, tuy nhiên bạn có thể thử cách này:

startActivity(new Intent("android.intent.action.CALL",Uri.parse("tel:*123" + Uri.encode("#"))); 
+4

và bạn lấy phản hồi ở đâu ? – Bellash

1

gọi USSD interuptn được chưa được hỗ trợ n Android

5

Bạn có thể gửi một mã USSD bằng mã dưới đây và cũng có thể bạn cần thêm sự cho phép (Điều này nên được một sự cho phép thời gian chạy sau Marshmallow cập nhật)

<uses-permission android:name="android.permission.CALL_PHONE" /> 

    String code = "*" + Uri.encode("#") + 456 + Uri.encode("#"); 
    startActivity(new Intent("android.intent.action.CALL", Uri.parse("tel:" + code))); 

Và bạn có thể đọc mã USSD bởi AccessibilityService

đây là ví dụ:

dịch vụ:

public class USSDService extends AccessibilityService { 
    private static final String TAG = "USSDService"; 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     Log.d(TAG, "onAccessibilityEvent"); 
     String text = event.getText().toString(); 
     Log.d(TAG, text); 
     } 
    } 

    @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; 
     info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
     setServiceInfo(info); 
    } 
} 

AndroidManifest.xml:

01.
<service android:name=".services.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/config_service" /> // created below 
</service> 

res/xml/config_service.xml:

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:accessibilityFlags="flagDefault" 
    android:canRetrieveWindowContent="true" 
    android:description="@string/accessibility_description" 
    android:notificationTimeout="100" 
    android:packageNames="com.cootf.sims" 
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" /> 

Run mã -> Enable khả năng tiếp cận thông qua Settings -> Accessibility -> [tên ứng dụng của bạn] -> Enable. Công việc hoàn thành!

Các vấn đề liên quan