【问题标题】:Lock SMS in android在android中锁定短信
【发布时间】:2014-05-14 19:38:57
【问题描述】:

我正在开发一个应用程序,我想阻止某些特定号码的短信。为此,我有一个 Activity 和第二个是 BroadcastReceiver 类。在 Activity 我有一个列表,用户将在其中输入他想要阻止的数字。但我不知道列表号将如何访问 BroadcastReceiver 类来阻止它。我在 BroadcastReceiver 类中访问一个 ArrayAdapter,但它不执行阻止呼叫。任何人帮助我..提前谢谢..
短信锁.java

public class SmsLock extends BroadcastReceiver {
    final SmsManager sms = SmsManager.getDefault();
    String phoneNumber;
    String senderNum;

    NumberListActivity ma = new NumberListActivity();

    NumberListActivity num = new NumberListActivity();

    String[] number = new String[] { "+923327765798", "+923219750751",
            "+923445508726" };

    @Override
    public void onReceive(Context context, Intent intent) {
        ArrayAdapter<String> adapter = ma.getArrayAdapter();

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage
                            .createFromPdu((byte[]) pdusObj[i]);
                    phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();
                }

                for (int i = 0; i < adapter.getCount(); i++) {
                    if (senderNum.contains(adapter.getItem(i))) {
                        abortBroadcast();
                    }
                }

            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" + e);

        }
    }

}     

NumberListActivity.java

public class NumberListActivity extends Activity {
    SharedPreferences preferences1;
    SharedPreferences.Editor spEditor1;
    int count1 = 0;
    ListView numList1;
    Button btnAdd1;
    ArrayList<String> list1 = new ArrayList<String>();
    ArrayAdapter<String> adapter1;
    public static final String Place1 = "placeKey";
    SmsLock brd = new SmsLock();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sms_list);

        preferences1 = getSharedPreferences("Place1", Context.MODE_PRIVATE);
        spEditor1 = preferences1.edit();
        count1 = preferences1.getInt("count1", 0);
        if (count1 > 0) {
            for (int i = 0; i < count1; i++) {
                list1.add(preferences1.getString("Value1[" + i + "]", ""));
            }
        }
        final EditText edit = (EditText) findViewById(R.id.Item);

        numList1 = (ListView) findViewById(R.id.Smslist);
        btnAdd1 = (Button) findViewById(R.id.Add);
        adapter1 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, list1);
        numList1.setAdapter(adapter1);
        numList1.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                /*
                 * list.remove(position); //preferences.edit().clear().commit();
                 * preferences.edit().remove("Value["+position+"]").commit();
                 * //count-=1; // adapter.remove(adapter.getItem(position));
                 */
                count1 = preferences1.getInt("count1", 0);
                // if (count > 0) {
                for (int i = position; i < count1; i++) {
                    // list.add();
                    if (i < count1)
                        spEditor1.putString(
                                "Value1[" + i + "]",
                                preferences1.getString("Value1[" + (i + 1)
                                        + "]", ""));
                    spEditor1.commit();

                }
                // }
                list1.remove(position);

                count1 -= 1;
                spEditor1.putInt("count1", count1);
                spEditor1.commit();
                // preferences.edit().remove(position);
                adapter1.notifyDataSetChanged();

            }
        });
        btnAdd1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // EditText edit = (EditText) findViewById(R.id.txtItem);
                spEditor1.putString("Value1[" + count1 + "]", edit.getText()
                        .toString());
                spEditor1.commit();
                list1.add(preferences1.getString("Value1[" + count1 + "]", ""));
                count1 += 1;
                spEditor1.putInt("count1", count1);
                spEditor1.commit();
                adapter1.notifyDataSetChanged();

            }
        });
    }

    public ArrayAdapter<String> getArrayAdapter() {
        return adapter1;

    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        Intent int1 = new Intent(NumberListActivity.this, Main.class);
        startActivity(int1);
        finish();
    }
}

【问题讨论】:

  • 从活动中,您可以输入可以存储在 sqlite 和广播中的号码,就像您使用电话号码数组一样,而不是您需要从数据库中读取电话号码 :)
  • 您要屏蔽短信或电话吗?
  • @Kedarnath:我用那个方法和结果也可以..但是如果用户想添加或删除一个数字那么他会做什么......
  • 那你需要写一段代码把电话号码保存在sqlite中。
  • @Saqib:SMS And call both but this time I want only SMS.

标签: android list broadcastreceiver android-arrayadapter android-broadcast


【解决方案1】:

为了访问您想要首先阻止的短信的号码,您需要将所有号码存储在您的 SQlite 数据库或首选项中,以便可以在广播接收器中访问它们,然后使用

 abortBroadcast();

防止邮件进入收件箱。

【讨论】:

  • 中止广播();可能很危险,因为它会阻止向所有其他广播接收器广播 SMS_RECEIVED 事件
【解决方案2】:

在您的广播接收器中,我假设您已成功提取传入 SMS 的电话号码和被阻止的号码列表。然后此代码将遍历被阻止的数字列表并适当地输入 if 块。

for (int i = 0; i < adapter.getCount(); i++) {
                    if (senderNum.contains(adapter.getItem(i))) {
                        abortBroadcast();
                    }
                }

如果您确定上述流程工作正常,但仍无法阻止接收短信,则可能是以下原因:

  1. 优先级:在清单文件中,您为应用程序设置接收 SMS_RECEIVED 意图的优先级。假设您的应用程序的优先级为 10,而操作系统的默认 SMS 应用程序的优先级为 20,那么您的应用程序只有在默认 SMS 应用程序之后才有机会响应 SMS_RECEIVED 意图。这解释了为什么 abortBroadcast() 在上面的代码中似乎不起作用。

我建议您在清单中为您的 broadCastReceiver 设置尽可能高的优先级,这样您就有机会处理 SMS_RECEIVED 意图。

  1. 从 API 19 及更高版本开始,一台设备上只能有一个 SMS 应用程序。如果有 2 个或更多应用程序有权拦截 SMS,则用户必须指定哪一个可用应用程序应作为默认 SMS 应用程序。那么选择的默认短信应用程序将只有响应 SMS_RECEIVED 意图的权限,其他应用程序将没有机会接收 SMS_RECEIVED 意图。

所以你还需要将你的目标SDK设置为18或以下才能正常使用短信拦截或者你需要阅读一些documentation如果你想让你的应用程序兼容API 19。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2014-08-07
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多