Android应用开发:电话监听和录音代码示例

 更新时间:2014年04月08日 10:10:45   作者:  
这篇文章主要介绍了Android应用开发中电话监听和电话录音的代码实例,同时附录了一个拍照、录像的例子,需要的朋友可以参考下

在oncreate 中执行:

复制代码 代码如下:

public void onCreate() {
  super.onCreate();
  Log.i("TAG", "服务启动了");

  // 对电话的来电状态进行监听
  TelephonyManager telManager = (TelephonyManager) this
    .getSystemService(Context.TELEPHONY_SERVICE);
  // 注册一个监听器对电话状态进行监听
  telManager.listen(new MyPhoneStateListener(),
    PhoneStateListener.LISTEN_CALL_STATE);
}


实现MyPhoneStateListener:
复制代码 代码如下:

private class MyPhoneStateListener extends PhoneStateListener {
  MediaRecorder recorder;
  File audioFile;
  String phoneNumber;

  public void onCallStateChanged(int state, String incomingNumber) {
   switch (state) {
   case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
    if (recorder != null) {
     recorder.stop(); //停止刻录
     recorder.reset(); //重设
     recorder.release(); //刻录完成一定要释放资源
    }
    break;
   case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */

    try {
     recorder = new MediaRecorder();
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频采集原
     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //内容输出格式
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //音频编码方式

     // recorder.setOutputFile("/sdcard/myvoice.amr");
     audioFile = new File(
       Environment.getExternalStorageDirectory(),
       phoneNumber + "_" + System.currentTimeMillis()
         + ".3gp");
     recorder.setOutputFile(audioFile.getAbsolutePath());
     Log.i("TAG", audioFile.getAbsolutePath());

     recorder.prepare(); //预期准备
     recorder.start();

    } catch (IllegalStateException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }

    break;
   case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */
    phoneNumber = incomingNumber;
    break;
   default:
    break;
   }
   super.onCallStateChanged(state, incomingNumber);
  }
 }


通过上续两个对应的步骤即可以实现通过server对电话的监听工作,在CALL_STATE_IDLE无状态(即空闲状态)、CALL_STATE_OFFHOOK 接通电话(即挂起)、CALL_STATE_RINGING 电话进来(即来电时)这几个状态中执行。

附:Android拍照、录像、录音代码范例

复制代码 代码如下:

package com.cons.dcg.collect;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import android.app.*;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.*;
import android.widget.*;

public class RecordActivity extends Activity implements OnClickListener {

        private static final int RESULT_CAPTURE_IMAGE = 1;// 照相的requestCode
        private static final int REQUEST_CODE_TAKE_VIDEO = 2;// 摄像的照相的requestCode
        private static final int RESULT_CAPTURE_RECORDER_SOUND = 3;// 录音的requestCode

        private String strImgPath = "";// 照片文件绝对路径
        private String strVideoPath = "";// 视频文件的绝对路径
        private String strRecorderPath = "";// 录音文件的绝对路径

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                this.setContentView(R.layout.problem_report);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                switch (requestCode) {
                case RESULT_CAPTURE_IMAGE://拍照
                        if (resultCode == RESULT_OK) {
                                Toast.makeText(this, strImgPath, Toast.LENGTH_SHORT).show();
                        }
                        break;
                case REQUEST_CODE_TAKE_VIDEO://拍摄视频
                        if (resultCode == RESULT_OK) {
                                Uri uriVideo = data.getData();
                                Cursor cursor=this.getContentResolver().query(uriVideo, null, null, null, null);
                                if (cursor.moveToNext()) {
                                        /** _data:文件的绝对路径 ,_display_name:文件名 */
                                        strVideoPath = cursor.getString(cursor.getColumnIndex("_data"));
                                        Toast.makeText(this, strVideoPath, Toast.LENGTH_SHORT).show();
                                }
                        }
                        break;
                case RESULT_CAPTURE_RECORDER_SOUND://录音
                        if (resultCode == RESULT_OK) {
                                Uri uriRecorder = data.getData();
                                Cursor cursor=this.getContentResolver().query(uriRecorder, null, null, null, null);
                                if (cursor.moveToNext()) {
                                        /** _data:文件的绝对路径 ,_display_name:文件名 */
                                        strRecorderPath = cursor.getString(cursor.getColumnIndex("_data"));
                                        Toast.makeText(this, strRecorderPath, Toast.LENGTH_SHORT).show();
                                }
                        }
                        break;
                }
        }

      

        /**
         * 照相功能
         */
        private void cameraMethod() {
                Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                strImgPath = Environment.getExternalStorageDirectory().toString() + "/CONSDCGMPIC/";//存放照片的文件夹
                String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";//照片命名
                File out = new File(strImgPath);
                if (!out.exists()) {
                        out.mkdirs();
                }
                out = new File(strImgPath, fileName);
                strImgPath = strImgPath + fileName;//该照片的绝对路径
                Uri uri = Uri.fromFile(out);
                imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                startActivityForResult(imageCaptureIntent, RESULT_CAPTURE_IMAGE);

        }

        /**
         * 拍摄视频
         */
        private void videoMethod() {
                Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
                startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
        }

        /**
         * 录音功能
         */
        private void soundRecorderMethod() {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("audio/amr");
                startActivityForResult(intent, RESULT_CAPTURE_RECORDER_SOUND);
        }

        /**
         * 提示信息
         * @param text
         * @param duration
         */
        private void showToast(String text, int duration) {
                Toast.makeText(ProblemReport.this, text, duration).show();
        }
}

相关文章

  • android studio与手机连接调试步骤详解

    android studio与手机连接调试步骤详解

    这篇文章主要为大家详细介绍了android studio与手机连接调试步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 探寻Android的线程问题

    探寻Android的线程问题

    这篇文章主要介绍了探寻Android的线程问题的相关资料,需要的朋友可以参考下
    2016-03-03
  • Android中给按钮同时设置背景和圆角示例代码

    Android中给按钮同时设置背景和圆角示例代码

    相信每位Android开发者们都遇到过给按钮设置背景或者设置圆角的需求,但是如果要同时设置背景和圆角该怎么操作才是方便快捷的呢?这篇文章通过示例代码给大家演示了Android中给按钮同时设置背景和圆角的方法,有需要的朋友们可以参考借鉴。
    2016-10-10
  • Android截屏保存png图片的实例代码

    Android截屏保存png图片的实例代码

    这篇文章主要介绍了Android截屏保存png图片的小例子,可以在应用提供这个小功能,很实用的
    2013-11-11
  • Android图片缓存之Lru算法(二)

    Android图片缓存之Lru算法(二)

    LRU缓存简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,这篇文章主要介绍了Android图片缓存Lru算法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • android通过代码的形式来实现应用程序的方法

    android通过代码的形式来实现应用程序的方法

    因为应用程序的安装与卸载模块在android系统中已经写好了,所以我们只需要激活就行了
    2013-10-10
  • Android AOP框架AspectJ使用详解

    Android AOP框架AspectJ使用详解

    本篇文章主要介绍了Android AOP框架AspectJ使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android Jetpack组件中LiveData的优劣

    Android Jetpack组件中LiveData的优劣

    LiveData是Jetpack组件的一部分,更多的时候是搭配ViewModel来使用,相对于Observable,LiveData的最大优势是其具有生命感知的,换句话说,LiveData可以保证只有在组件( Activity、Fragment、Service)处于活动生命周期状态的时候才会更新数据
    2023-04-04
  • android利用handler实现倒计时功能

    android利用handler实现倒计时功能

    这篇文章主要为大家详细介绍了android利用handler实现倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Android使用View Animation实现动画加载界面

    Android使用View Animation实现动画加载界面

    这篇文章主要为大家详细介绍了Android使用View Animation实现动画加载界面的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04

最新评论