- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 ussd 进行了很多研究,但我无法阅读 USSD 响应,以及如何防止类似此应用程序的 ussd 对话。
https://play.google.com/store/apps/details?id=com.iba.ussdchecker&hl=en
我安装了这个 https://github.com/alaasalman/ussdinterceptor重启我的手机(S2 android 4.0.3),发送ussd代码但没有任何反应,有人告诉我必须阅读日志,但我该怎么做。
我尝试使用这些代码从日志中读取 USSD
USSD.java
package com.example.ussd;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import android.util.Log;
public class USSD {
private static String startmsg = "displayMMIComplete"; // start msg to look
// for
private static String endmsg = "MMI code has finished running"; // stop msg
private static String trimmsg = "- using text from MMI message: '"; // a msg
// to
// remove
// from
// the
// text
private long before = 3000; // delay (ms) before creation of the class
// before a msg (USDD) is valid (use timestamp)
private long after = 3000; // delay (ms) after creation of the class that a
// msg (USDD) is valid (wait after ms)
private String msg = ""; // the USSD message
private boolean found = false;
private long t = -1; // timestamp of the found log
public USSD() {
this(3000, 3000);
}
// USSD in log : example
public USSD(long before_creation, long after_creation) {
before = before_creation;
after = after_creation;
long timestamp = System.currentTimeMillis(); // creation of the class
// --> look for the USSD
// msg in the logs
Log.d("USSDClass",
"Class creation - timestamp: " + String.valueOf(timestamp));
try {
// sample code taken from alogcat ...
Process logcatProc = Runtime.getRuntime().exec(
"logcat -v time -b main PhoneUtils:D"); // get PhoneUtils
// debug log with
// time information
BufferedReader mReader = new BufferedReader(new InputStreamReader(
logcatProc.getInputStream()), 1024);
String line = "";
boolean tostop = false;
long stop = timestamp + after; // to stop the while after "after" ms
while (((line = mReader.readLine()) != null)
&& (System.currentTimeMillis() < stop) && (tostop == false)) {
if (line.length() > 19) // the line should be at least with a
// length of a timestamp (19) !
{
if (line.contains(startmsg)) // check if it is a USSD msg
{
// log example :
// "12-10 20:36:39.321 D/PhoneUtils( 178): displayMMIComplete: state=COMPLETE"
t = extracttimestamp(line); // extract the timestamp of
// thie msg
Log.d("USSDClass", "Found line at timestamp : "
+ String.valueOf(t));
if (t >= timestamp - before)
found = true; // start of an USDD is found & is
// recent !
} else if (found) {
// log example :
// "12-10 20:36:39.321 D/PhoneUtils( 178): displayMMIComplete: state=COMPLETE"
if (line.contains(endmsg))
tostop = true;
else {
// log example :
// "12-10 20:36:39.321 D/PhoneUtils( 178): - using text from MMI message: 'Your USSD message with one or several lines"
Log.d("USSDClass", "Line content : " + line);
String[] v = line.split("\\): "); // doesn't need
// log
// information
// --> split
// with "): "
// separator
if (v.length > 1)
msg += v[1].replace(trimmsg, "").trim() + "\n";
}
}
}
}
} catch (IOException e) {
Log.d("USSDClass", "Exception:" + e.toString());
}
}
public boolean IsFound() {
return found;
}
public String getMsg() {
return msg;
}
// extract timestamp from a log line with format
// "MM-dd HH:mm:ss.ms Level/App:msg" Example : 12-10 20:36:39.321
// Note : known bug : happy new year check will not work !!!
private long extracttimestamp(String line) {
long timestamp = -1; // default value if no timestamp is found
String[] v = line.split(" ");
if (v.length > 1) // check if there is space
{
Calendar C = Calendar.getInstance();
int y = C.get(Calendar.YEAR);
String txt = v[0] + "-" + y + " " + v[1]; // transform in format
// "MM-dd-yyyy HH:mm:ss"
SimpleDateFormat formatter = new SimpleDateFormat(
"MM-dd-yyyy HH:mm:ss");
try {
Date tmp = formatter.parse(txt);
timestamp = tmp.getTime();
String[] ms = v[1].split("."); // get ms
if (ms.length > 1)
timestamp += Integer.getInteger(ms[1]);
} catch (ParseException e) {
Log.d("USSDClass",
"USDD.extractimestamp exception:" + e.toString());
}
}
return timestamp;
}
}
UssdActivity.java
package com.example.ussd;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
public class UssdActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private TextView view;
private AutoCompleteTextView number;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
this.view = (TextView) findViewById(R.id.Text2);
this.number = (AutoCompleteTextView) findViewById(R.id.Text1);
}
@Override
public void onClick(View arg0) {
String encodedHash = Uri.encode("#");
call("*" + number.getText() + encodedHash);
this.view.setText("");
}
protected void call(String phoneNumber) {
try {
startActivityForResult(
new Intent("android.intent.action.CALL", Uri.parse("tel:"
+ phoneNumber)), 1);
} catch (Exception eExcept) {
this.view.append("\n\n " + "\n" + eExcept.toString());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
USSD ussd = new USSD(4000, 4000);
if (ussd.IsFound())
this.view.append("\n test" + ussd.getMsg());
else
this.view.append("" + R.string.error_ussd_msg);
}
}
输出是这样的:
com.sec.android.app.callsetting.allcalls:com.sec.android.callsetting.allcalls.AllCallsProvider Terminated ALSA PLAYBACK device hifi
最佳答案
可以使用无障碍服务。首先创建一个服务类:
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);
}
}
在 Android list 中声明它
<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" />
</service>
创建一个描述无障碍服务的 xml 文件,名为 ussd_service
<?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" />
就是这样。安装应用后,您必须在辅助功能设置中启用该服务(设置->辅助功能设置-> YourAppName)。
解决方案描述here和 here (russian) .
关于android - 阻止 USSD 对话并读取 USSD 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057625/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!