当前位置:  编程技术>移动开发
本页文章导读:
    ▪Service范例应用之电话录音        Service实例应用之电话录音我们知道,Android有四大组件,分别是Activity,Content Provider , Broadcast Receiver 和今天我们要用到的Service。 我们说Service是看不见摸不着的,是因为它对用户是不可见的,S.........
    ▪ 乔布斯究竟是怎​样成就的        乔布斯究竟是怎​样造就的 了解乔布斯的人都知道,乔布斯不太懂技术,比尔盖茨就笑话他不会编程。但是乔布斯自小就对电子学深感兴趣,这得益于硅谷大环境,以及他养父和邻居家少年.........
    ▪ 虚拟机+ubuntu上双网卡配置笔记       虚拟机+ubuntu下双网卡配置笔记备注:基本概念,所谓双网卡是指ubuntu虚拟出来的网卡,并不是真正有两块网卡。所以两块网卡不可能同时工作,是能是两块网卡之间来回切换。我配置双网卡.........

[1]Service范例应用之电话录音
    来源: 互联网  发布时间: 2014-02-18
Service实例应用之电话录音

我们知道,Android有四大组件,分别是Activity,Content Provider , Broadcast Receiver 和今天我们要用到的Service。

我们说Service是看不见摸不着的,是因为它对用户是不可见的,Service作为四大组件之一,它的职责是工作在后台,处理

一些比较耗时的操作(如下载,播放媒体文件,检测版本更新和日志输出等)。

就像学习Activity组件一样,要想熟悉Service,必须知道它的整个工作流程,即它的生命周期(Life-cycle),下面是官网给

出的一个具体图例:



从图例我们可以知道,Service有两种启动方式,第一种是调用Context.startService()方法,

另外一种是调用Context.bindService().

对于第一种调用方法,系统会先调用onCreate()方法,负责初始化工作,然后调用onStart()方法,

启动Service,如果程序显示调用Context.stopService()方法或者Service自身调用stopSelf()方法

或者stopSelfResult()方法,都会调用onDestroy()方法,结束该服务,另外需要注意的是,调用者

和Service是没有关联的,也就是说,如果调用者退出了,并不会影响服务的运行。

对于第二种方式,调用方法是Context.bindService(),系统会先调用onCreate()方法,然后调用onBind()

方法,和调用者绑定,如果调用者退出,服务会调用onDestroy()方法结束自己的运行。


学完了一个东西,如果趁热打铁,自己编写一个demo,肯定会加深对该知识点的理解。

废话少说,下面给出一个电话录音的例子:


首先,也是最重要的,关于权限的声明:

    <!-- 电话状态监听权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 开机广播权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <!-- 音频刻录权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 写入权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

接下来是编写一个简单的Activity,用来启动Broadcast Receiver组件。


package com.example.service_record_call;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Intent receiver = new Intent("zjut.tsw.receiver");
        this.sendBroadcast(receiver);
    }

    
}

然后是编写一个简单的Broadcast Receiver,负责启动Service


package com.example.service_record_call;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent service = new Intent(context,PhoneListenerService.class);
		context.startService(service);
	}

}

接下来是编写核心Service.


package com.example.service_record_call;

import java.io.File;

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;
import android.util.Log;

public class PhoneListenerService extends Service {

	
	private final String TAG = "PhoneListenerService";
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	@Override
	public void onCreate() {
		TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		telephonyManager.listen(new TeleListine(), PhoneStateListener.LISTEN_CALL_STATE);
		Log.i(TAG,"onCreate");
		super.onCreate();
	}
	
	private class TeleListine extends PhoneStateListener {
		
		private String mobile; //来电电话
		private MediaRecorder recorder; //多媒体刻录文件
		private File autoFile; //保存文件
		private boolean recoder; //是否刻录
		
		@Override
		public void onCallStateChanged(int state,String incomingNumber) {
			try{
				switch(state) {
				case TelephonyManager.CALL_STATE_IDLE :
					
					if(recoder) {
						recorder.stop();
						recorder.release();
						recoder = false;
					}
					break;
					
				case TelephonyManager.CALL_STATE_OFFHOOK :
					recorder = new MediaRecorder();
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);					//这里只是录制自己的声音,如果想录制双方的通话声音,可改用MediaRecorder.AudioSource.VOICE_CALL
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					String root_directory = Environment.getExternalStorageDirectory() + "/recorded_calls";
					File root_file = new File(root_directory);
					if(!root_file.exists()) {
						root_file.mkdir();
					}
					String record_call = root_directory + "/" + mobile + "_" + System.currentTimeMillis() + ".3gp";
					File autoFile = new File(record_call);
					if(!autoFile.exists()) {
						autoFile.createNewFile();
					}
					//autoFile = new File(getCacheDir(),mobile+ "_" + System.currentTimeMillis() + ".3gp");
					recorder.setOutputFile(autoFile.getAbsolutePath());
					recorder.prepare();
					recorder.start();
					recoder = true;
					Log.i(TAG,"接起电话");
					break;
					
				case TelephonyManager.CALL_STATE_RINGING :
					mobile = incomingNumber;
					Log.i(TAG,"mobile=" + mobile);
					break;
				default :
					break;
				}
			}catch(Exception e) {
				Log.i(TAG,e.toString());
				e.printStackTrace();
			}
			super.onCallStateChanged(state, incomingNumber);
		}
		
		
	}

}

别忘了在AndroidManifest.xml中注册组件Service和Broadcast Receiver


        <receiver android:name=".MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="zjut.tsw.receiver" />
            </intent-filter>
        </receiver>

        <service android:name=".PhoneListenerService" >
        </service>

这样,当您打开了该软件,或者开机后,该服务会自动启动并运行(你可以在Android机上按Menu键->设置->应用程序->运行的服务 查看该服务的具体状态)

当有人打电话给你或者你打给别人,电话录音会保存在/recorded_calls/...里面。(该程序含有潜在的错误,如果通话时间足够多或足够长(煲电话粥的同志们注意了哦),可能会导致SD卡内存不足)


有需要源码的请Click:http://download.csdn.net/detail/czjuttsw/4700525


Over...





2楼zx012345昨天 16:39请问楼主:MediaRecorder.AudioSource.VOICE_CALL 这个参数有效吗?Re: czjuttsw昨天 17:35回复zx012345n当然有啊,你看源码就知道了:n public final class AudioSource {n * in include/media/mediarecorder.h!n */n private AudioSource() {}n public static final int DEFAULT = 0;n /** Microphone audio source */n public static final int MIC = 1;nn /** Voice call uplink (Tx) audio source */n public static final int VOICE_UPLINK = 2;nn /** Voice call downlink (Rx) audio source */n public static final int VOICE_DOWNLINK = 3;nn /** Voice call uplink + downlink audio source */n public static final int VOICE_CALL = 4;nn /** Microphone audio source with same orientation as camera if available, the mainn * device microphone otherwise */n public static final int CAMCORDER = 5;nn /** Microphone audio source tuned for voice recognition if available, behaves liken * {@link #DEFAULT} otherwise. */n public static final int VOICE_RECOGNITION = 6;n }1楼zx012345昨天 09:36有这个参数,但并不代表它就有效。n我测试过几部手机,没有一部能用MediaRecorder.AudioSource.VOICE_CALL进行电话录音。Re: czjuttsw昨天 11:46回复zx012345n我的手机就有效呢。。

    
[2] 乔布斯究竟是怎​样成就的
    来源: 互联网  发布时间: 2014-02-18
乔布斯究竟是怎​样造就的

了解乔布斯的人都知道,乔布斯不太懂技术,比尔盖茨就笑话他不会编程。但是乔布斯自小就对电子学深感兴趣,这得益于硅谷大环境,以及他养父和邻居家少年电子专家的影响和熏陶。后来乔布斯遇上斯蒂芬·沃兹尼亚克,两人臭味相投,都热衷于用电子产品来搞恶作剧。对电子产品的这份热情是驱使他不断发现和应用新技术的源动力。

  不过乔布斯的热情并不仅仅局限于电子产品,他的最后几年一直在忙于设计他的私人游艇,他最终没能坐上这艘游艇,但是设计的过程已经令他满足。从这个意义上来说,乔布斯跟所有男人一样,是对玩具感兴趣。不一样的是,他对几乎一切人造物品都吹毛求疵,他创造和改造了大家都在用的玩具——电脑、音乐播放器和手机。

  一些看似偶然的事件让乔布斯得以拥有这样的能力。遇上斯蒂芬·沃兹尼亚克,让他以最好的方式进入最能一展才华的领域——电子产品和计算机行业;遇上“现实扭曲力场”之父弗里德兰,让他拥有强大气场,可以左右员工思想;在大学旁听了艺术字体的课程,让他对艺术有了浓厚的兴趣,为他将来设计产品带来灵感;看到一本书——《禅者的初心》,让他了解禅宗,重视直觉,助他选择技术和开发产品;被自己雇来的约翰·斯库利从苹果赶走,激发他从零开始重头再来……

  据他自己说,他“跟着自己的直觉和好奇心走, 遇到的很多东西,此后被证明是无价之宝。”他的经历作为一个个点,日后被连结了起来,助他走向成功。所以,他建议所有人都去追随自己的内心。

  这话听起来有点诡异。谁能保证一生中遇到的所有事一定都是对他有益的?而且其意义又会在日后显现出来?听起来有点像宿命论。有人或许会说:成功的人就是能够从一切事物中吸取对自己有益的东西。这是励志的话,听起来似乎有道理,却有些牵强。可是人生没有假设,谁又能肯定地说,如果乔布斯没有遇到那些人那些事,他就不会取得今天这样的成就呢?乔布斯自己的解释是:“你必须要相信某些东西:你的勇气、目的、生命、因缘。”

  到最后,我们只能这样尽量客观的总结:乔布斯智商高,好奇心强,追求自我实现,追求价值,又在某种机缘巧合下遇到一些让他得以辉煌的人和事。

  有些人不屑看《乔布斯传》,可是至少我们能从乔布斯身上学到执着和热情;有的人认为一切成功源于机遇,可是至少我们应该多发掘自己的兴趣和热情,让自己拥有尽可能多的机会遇到那些人那些事。


    
[3] 虚拟机+ubuntu上双网卡配置笔记
    来源: 互联网  发布时间: 2014-02-18
虚拟机+ubuntu下双网卡配置笔记

备注:基本概念,所谓双网卡是指ubuntu虚拟出来的网卡,并不是真正有两块网卡。所以两块网卡不可能同时工作,是能是两块网卡之间来回切换。我配置双网卡的目的只是为了工作方便,即是,当我的虚拟机需要连接外网时(比如从互联网上下载资源,从服务器上更新资源等等),就切换到nat模式下。当我需要让ubuntu拥有独立固定的ip作为局域网中的访问对象是(比如需要将虚拟机作为nfs挂载的服务器等等),就切换到bridged模式下。

配置步骤:

1、关闭虚拟机,具体步骤是:打开终端输入:sudo halt

2、VM——>setting——>Network adaptor——>add——>Network adaptor——>next 。。。。。。之后的跟着引导配置即可。

3、配置VMnet1和VMnet8的IP,在更改适配器配置里边修改,具体怎么配就不说了,直接上图:

 

4、配置虚拟机的Virtual Network Editor ,Editor——>Virtual Network Editor,具体就不细说了,直接上图:

5、配置不同的模式下网卡的ip,bridged模式下Auto eth0的配置如下图:

NAT模式下,自动以太网卡的配置如下:

 


    
最新技术文章:
▪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添加多个可点击的文本
HTML教程 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