当前位置:  编程技术>移动开发
本页文章导读:
    ▪阻截短信,不让系统发通知        拦截短信,不让系统发通知 首先在AndroidManifest.xml配置文件中加入如下代码: <receiver android:name=".SMSReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telep.........
    ▪ SharedPreferences,AlertDialog,TelephonyManager,播音的使用,SmsManager        SharedPreferences,AlertDialog,TelephonyManager,广播的使用,SmsManager 关于SharedPreferences 在android平台下用于保存数据有三种方式,1、SQLite 2、SharedPreferences 3、File SharedPreferences是将数据保存在一个xml文件.........
    ▪ AudioManager中的OnAudioFocusChangeListener的施用       AudioManager中的OnAudioFocusChangeListener的使用         今天修改MP3中的一个小问题:在来短信的时候自动暂停音乐播放,当短信音播放完毕以后,或手动查看通知导致短信音结束后,音乐自动播.........

[1]阻截短信,不让系统发通知
    来源: 互联网  发布时间: 2014-02-18
拦截短信,不让系统发通知
首先在AndroidManifest.xml配置文件中加入如下代码:
<receiver android:name=".SMSReceiver">
			<intent-filter android:priority="1000">
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>


然后创建一个继承BroadcastReceiver的类SMSReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {

		Log.i("tag", "onReceive");
		// 第一步、获取短信的内容和发件人
		StringBuilder body = new StringBuilder();// 短信内容
		StringBuilder number = new StringBuilder();// 短信发件人
		Bundle bundle = intent.getExtras();

		if (bundle != null) {
			Object[] myOBJpdus = (Object[]) bundle.get("pdus");
			SmsMessage[] message = new SmsMessage[myOBJpdus.length];
			for (int i = 0; i < myOBJpdus.length; i++) {
				message[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
			}
			for (SmsMessage currentMessage : message) {
				body.append(currentMessage.getDisplayMessageBody());
				number.append(currentMessage.getDisplayOriginatingAddress());
			}

			String sms_body = body.toString();
			String sms_number = number.toString();

			Log.i("sms_body", "sms_body=" + sms_body);
			Log.i("sms_number", "sms_number=" + sms_number);

			if (sms_number.contains("+86")) {
				sms_number = sms_number.substring(3);
			}

			// 第二步、确认该短信内容是否满足过滤条件
//			boolean flags_filter = false;
			// for(****){//进行判断,如果满足
			// flags_filter=true}
			//                                             
			// //第三步、取消
			// if(flags_filter){
//调用这一句代码后,系统将不处理当前的广播
			 this.abortBroadcast();
			// }

		}
	}
}

然后运行程序后,用ddms进行发短信。这时后,你就可以捕获到别人发来的短信。
1 楼 larry1030 2012-01-20  
模拟器中可以, 真机貌似不行。
2 楼 wangzhigang2 2012-03-05  
你用的什么型号的手机?

    
[2] SharedPreferences,AlertDialog,TelephonyManager,播音的使用,SmsManager
    来源: 互联网  发布时间: 2014-02-18
SharedPreferences,AlertDialog,TelephonyManager,广播的使用,SmsManager

关于SharedPreferences

在android平台下用于保存数据有三种方式,1、SQLite 2、SharedPreferences 3、File

SharedPreferences是将数据保存在一个xml文件中,并且是以Map的形式保存,一个Key对应一个Value 但获取某一个Key的时候,都会有一个默认值,这个默认值是在xml不存在这个key值的时候使用

  • 获得SharedPreferences :

    获得SharedPreferences是通过上下文(Context)中的getSharedPreferences方法获得。

  • SharedPreferences sp = this.getSharedPreferences("data", MODE_WORLD_READABLE);

    第一个参数是指定xml文件的名字,当不存在的时候就会创建它。第二个参数是获得这个SharedPreferences的模式,一共有四种模式:MODE_APPEND 、MODE_PRIVATE、 MODE_WORLD_READABLE 、MODE_WORLD_WRITEABLE

  • 从SharedPreferences中取值

    通过sp.getXXX的方式可以获得对应key的值,在getXXX的时候,需要指定一个默认的值,当key值不存在的时候使用

  • ShaSharedPreferences中设值

    需要用到Editor

    Editor editor = sp.edit();

    获得了Editor之后,才能对SharedPreferences进行写

    editor.putXXX("key",value)

    最后需要注意的一点是别忘了commit

  • Xml文件存放的位置位于data/data/包名/shared_prefs/xxx.xml
  •  

    关于AlertDialog

    创建AlertDialog需要用到AlertDialog.Builder这个对象,对这个Builder做相应的设置,可以使AlertDialog有不同的展现

    AlertDialog.Builder builder = new AlertDialog.Builder(this)

    builder.setTitle("");

  • 创建普通的AlertDialog

    builder.setNegativeButton("xxx", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which)

                }

            });

    一共有三种Button:NegativeButton,PositiveButton,NeutralButton(三个which值不同)

  • 这三种Button默认的实现了点击之后消失AlertDialog

  • 创建自定义布局的AlertDialog
  • 创建自定义布局的AlertDialog,需要一个布局文件,我们所需要做的就是将这个布局文件变成一个View对象,再将这个View对象设置到Builder里面去

    将布局文件变成一个View对象,需要用到LayoutInflater这个对象中的inflate方法

    LayoutInflater inflater = LayoutInflater.from(this);

    View view = inflater.inflate(R.layout.showpassworddialog, null);

    之后再builder.setView(view)就可以将自定义的布局文件放到Dialog里面去了

    在这个自定义的布局文件中,我们也是可以取到里面定义的控件,通过view.findViewById() 就可以找到自定义布局文件中的相应控件,之后就可以设置或者做事件的监听

    AlertDialog dialog = builder.create();

    dialog.show();

     

    TelephonyManager

    获取SIM卡信息。在SIM卡中并没有保存用户的手机,区分每一张SIM是通过IMSI码。在运营商的数据库中存在手机号码和IMSI码的映射,所以手机是通过发送IMSI码到运营商的一端,获得自己的手机号码。

    TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);

    //获取手机号码,一般是为空的,因为运营商没有基本没有把本机电话保存在SIM卡中

    标识每一张SIM卡是通过IMSI码(tm.getSubscriberId()).

    //在运营商的数据库表中有IMSI码与电话号码的映射。所以,手机是通过发送IMSI码到运营商一端,才获得自己的手机号码

    String phonenumber = tm.getLine1Number();

    //获得每一张电话卡的唯一标识 IMIS码

    String subscriberid = tm.getSubscriberId();

    //获取手机的IMEI号码 国际移动设备识别码是区别移动设备的标志

    String deviceId = tm.getDeviceId();

    //获取国际的国家编码 中国:cn

    String networkiso = tm.getNetworkCountryIso();

    //获取网络的MCC+MNC编码 中国电信天翼460003 中国移动46000

    String networkoper = tm.getNetworkOperator();

    //获取网络的MCC+MNC编码对应的名称 中国电信:China Telecom 中国移动:China Mobile

    String networkoper_name = tm.getNetworkOperatorName();

    //获取SIM的串号 串号是标识物理设备的

    String simnumber = tm.getSimSerialNumber();

    //获取网络的类型

    int phonetype = tm.getPhoneType();

    String phonetype_str = "null";

        switch(phonetype){

         case TelephonyManager.PHONE_TYPE_GSM:

             phonetype_str ="GSM网络";

             break;

         case TelephonyManager.PHONE_TYPE_CDMA:

             phonetype_str ="CDMA网络";

         break;

         case TelephonyManager.PHONE_TYPE_NONE:

             phonetype_str ="未识别网络";

         break;

        }

    int simstate = tm.getSimState();

    String simstatestr = "null";

    switch(simstate ){

         case TelephonyManager.SIM_STATE_UNKNOWN:

             simstatestr = "未知状态";

             break;

         case TelephonyManager.SIM_STATE_ABSENT:

             simstatestr = "未插卡";

             break;

         case TelephonyManager.SIM_STATE_PIN_REQUIRED:

             simstatestr = "需要PIN密码解锁";

         break;

         case TelephonyManager.SIM_STATE_PUK_REQUIRED:

             simstatestr = "需要PUK密码解锁";

         break;

         case TelephonyManager.SIM_STATE_READY:

             simstatestr = "就绪";

         break;

         case TelephonyManager.SIM_STATE_NETWORK_LOCKED:

             simstatestr = "SIM已经被锁住";

         break;

        }

    读取这些数据需要权限

    READ_PHONE_STATE">

     

    广播的使用

    在android系统中,广播运用的很广泛。许多系统的事件都喜欢把它封装成广播。比如手机的电量改变,手机开机完毕,手机接收到短信等等。那么广播到底是什么呢?广播通俗的理解应该是android系统在整个手机内部发送的一个消息。比如手机开机完毕,当手机开机完成之后,就会在整个手机的内部发送一个"启动完毕"的消息。如果有一个广播接收着,它感兴趣的消息是"启动完毕",这时候,这个广播接收者就会有所操作,比如启动某个程序,这样就可以实现开机启动程序的功能了。

    系统中提供了许许多多的广播,也可以用户自定义广播。

    广播接收者,对感兴趣的消息进行捕捉,一旦有这个消息出现,就进行相应的操作。

    广播接收者比较重要的地方分为两点,1、 广播接收者的注册 2、

  • 广播接收者的注册
  • 代码中注册         临时有效
  • 注册
  • 注销
  • Manifest文件中注册 永久有效,直到这个程序被卸载
  • 指定这个广播接收者所感兴趣的广播,通过标签指定
  • 开机完毕时发送的广播:

    <receiver android:name=".BootCompleteReceiver">

            <intent-filter>

            <action android:name="android.intent.action.BOOT_COMPLETED"/>

            intent-filter>

    receiver>

    接收短信时发送的广播

    <receiver android:name=".ReceiveSMSReceiver">

    <intent-filter>

        <action android:name="android.provider.Telephony.SMS_RECEIVED" />

    intent-filter>

    receiver>

    在接收某些广播的时候需要权限,例如接收短信的广播就需要

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

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

     

    SmsManager

    1、发送短信

    SmsManager smsManager = SmsManager.getDefault();

    // 按照一条短信,最大容量拆分成多条短信

    List divideContents = smsManager.divideMessage("手机IMSI码为" + safedSubscriberid + " 已被更换SIM卡,更换的SIM卡IMSI码为:" + subscriberid);

                for (String text : divideContents) {

                 smsManager.sendTextMessage(savedNumber, null, text, null, null);

                }

    -- destinationAddress:目标电话号码

    -- scAddress:短信中心号码,测试可以不填

    -- text: 短信内容

    -- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理 即,这个意图包装了短信发送状态的信息

    -- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理 即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。

        声明短信发送权限

    AndroidManifest.xml

     

  • 读取短信内容
  • 接收短信时发送的广播

    <receiver android:name=".ReceiveSMSReceiver">

    <intent-filter>

        <action android:name="android.provider.Telephony.SMS_RECEIVED" />

    intent-filter>

    receiver>

    在接收某些广播的时候需要权限,例如接收短信的广播就需要

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

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

    当短信到来的时候,系统会将短信的内容封装成pdu的格式,然后放到intent里面。所以要获得短信的内容,就通过intent,将puds拿出来就可以了,它返回的是Object数组

    Object[] messages = (Object[]) intent.getSerializableExtra("pdus");

    创建一个二维字节数组

            byte[][] pduObjs = new byte[messages.length][];

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

                pduObjs[i] = (byte[]) messages[i];

            }

            byte[][] pdus = new byte[pduObjs.length][];

            int pduCount = pdus.length;

            SmsMessage[] msgs = new SmsMessage[pduCount];

            for (int i = 0; i < pduCount; i++){

                pdus[i] = pduObjs[i];

                msgs[i] = SmsMessage.createFromPdu(pdus[i]);

            }

            return msgs;

        }

    一条短信就是一个SmsMessage ,这个SmsMessage可以通过一个byte[]来创建

     

     

     

     

    小结:

    广播接收者,对接收短信进行监听,当手机接收到一条短信的时候,系统会发出一条广播,被广播接收者接收。别忘了要将这个广播接收者注册

    在onReceive方法中有一个参数intent,当拦截这条短信的时候,所有的短信信息都会封装在这个intent中,我们可以通过这个intent来获取短信信息

     

    短信封装的形式pdu

    Object[] object = (Object[]) intent.getSerializableExtra("pdus");

     

    一条短信就是一个SmsMessage对象,一个SmsMessage对象通过一个byte[]来创建,一个byte[]数组就是一个object对象

     

    Object[]

    Object[0]: 存在的形式 byte[] 一条短信

    Object[1]

    Object[2]

    Object[3]

     

    所以Object[] 对应着一个byte[][]的二维数组

    byte[][] pdus = new byte[object.length][];

    pdus[i] = (byte[]) object[i];

    SmsMessage message = SmsMessage.createFromPdu(pdus[i]);

    获得来短信号码:

    String oriAddress = msgs[i].getDisplayOriginatingAddress();

    获得来短信的内容:

    String body = msgs[i].getDisplayMessageBody();

     

    完善:

    将接收短信和发送短信改成后台操作,不在机子上有相关的显示

    通过gps,发送的短信内容包含位置信息


        
    [3] AudioManager中的OnAudioFocusChangeListener的施用
        来源: 互联网  发布时间: 2014-02-18
    AudioManager中的OnAudioFocusChangeListener的使用

            今天修改MP3中的一个小问题:在来短信的时候自动暂停音乐播放,当短信音播放完毕以后,或手动查看通知导致短信音结束后,音乐自动播放。

            查看android自带的播放器源码后发现使用的是OnAudioFocusChangeListener这个监听器来监听声音焦点的改变的。附上代码:

     

    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    public void play() {
            mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN);
    ......
    }

     

     

            在此几行代码中,拿到AudioManager的实例,然后调            用requestAudioFocus方法,第一个参数为监听声音焦点改变的监听器,后两个不太明白,第二个好像是主要的监听音频类型,

    这里设置为音乐。

            然后在service的onDestory方法中调用mAudioManager.abandonAudioFocus(mAudioFocusListener);貌似是注销监听器的意思。

    private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
            public void onAudioFocusChange(int focusChange) {
                mMediaplayerHandler.obtainMessage(FOCUSCHANGE, focusChange, 0).sendToTarget();
            }
        };
            这个监听器就很好理解了就不多说了。 

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    编程技术其它 iis7站长之家
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3