android工作总结

研究android也有一段时间了,单从知识点来说,也撑握了不少东西,却从未在网上发布过任何东西。为了让喜欢android的新手们(其实我也是新 手)少走弯路,从现在起,我会把我总结的(更多是整理的别人的,我只一起展示给大家,也望作者勿怪)知识共享给大家,也希望大家能多提意见,共同进步。

最基本的开发环境配置、hello world等内容网上很多,我这里不写了,我只把各功能点和注意事项列给大家。

内容如下:

1、绘图
2、短信服务
3、电话服务
4、互联网应用
5、GOOGLE MAP
6、位置服务
7、SQLit
9、多媒体播放
9、多媒体录制
10、拍照
......
还有其它更细的知识点介绍。

(作者:子轩,邮箱:)
Android学习心得(一)——绘图做java的都知道,绘图肯定首先需要一个 Canvas,然后在用Graphics在上面绘制自己想要图案。不错,Android上面也类似,你可以从一个Bitmap得到它的Canvas,进行 绘制,也可以自定义一个View,用它的Canvas。不同的时,Android里没有Graphics,而用Paint代之,当然用法也稍有不同。以下 是自定义View的一段代码:

@Override
public void onDraw(Canvas canvas) {
// 首先定义一个paint
Paint paint = new Paint();

// 绘制矩形区域-实心矩形
// 设置颜色
paint.setColor(Color.WHITE);
// 设置样式-填充
paint.setStyle(Style.FILL);
// 绘制一个矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);

// 绘空心矩形
// 设置颜色
paint.setColor(Color.RED);
// 设置样式-空心矩形
paint.setStyle(Style.STROKE);
// 绘制一个矩形
canvas.drawRect(new Rect(10, 10, 50, 20), paint);

// 绘文字
// 设置颜色
paint.setColor(Color.GREEN);
// 绘文字
canvas.drawText(str, 30, 30, paint);

// 绘图
// 从资源文件中生成位图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 绘图
canvas.drawBitmap(bitmap, 10, 10, paint);
}

以上需要注意的有三点:
1、Android中的Rect和java中的可能稍有区别,前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度);
2、Style.STROKE和Style.FILL外边的像素数是有区别的,这点和java里一样;
3、绘文字时,设置的坐标点为(30,30),但绘出来后你会发现,文字的左上角坐标要比你设置的偏上,不知道是android设置的bug,还是我们有理解到坐标点的意义。


Android学习心得(二)——短信服务Android中发短信非常方便,两行代码:
SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage("10086", null, "hello", null, null);
由于现在我还没有Android手机,也不知道这样能否成功。

收短信稍稍复杂一点,需要建立一个BroadcastReceiver,来监听android.provider.Telephony.SMS_RECEIVED事件,我不太详述,完整代码如下:
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObj = (Object[]) bundle.get("pdus");
if (pdusObj != null) {
SmsMessage[] messages = new SmsMessage[pdusObj.length];
for (int n = 0; n < pdusObj.length; n++) {
messages[n] = SmsMessage.createFromPdu((byte[]) pdusObj[n]);
Log.d("MsgTest", "Message: " + n + " " + messages[n].getMessageBody());
Log.d("MsgTest", "Message from: " + messages[n].getOriginatingAddress());
}
}
}
}
}
注意:
1、不要忘记添加短信收发相关的权限;
2、不要忘记配置SMSReceiver。

(作者:子轩,邮箱:)
Android学习心得(三)——电话服务Android打电话也是两行代码:
Intent intent = new Intent("android.intent.action.DIAL", Uri.parse("tel:10086") );
startActivity(intent);
这样便进进入呼叫界面了。

接下来我们再看一下监听电话状态的功能。

监听电话状态首先建立一个继承于PhoneStateListener电话监听类(如:TeleListener),并让TelephonyManager监听它。
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
TeleListener需要实现父类的几个方法,onCallStateChanged、onServiceStateChanged、onSignalStrengthChanged,根据方法名我们便可知其功能,这里就不再详述。
Android学习心得(四)——互联网应用Android中,互联网应用和java里基本一样,也没有什么好说的,但在我测试上传图片时遇到一个问题,先看一段代码:
private void uploadImage(String httpUrl) {
try {
OutputStream os = null;
InputStream is = null;
URL url = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("X-Online-Host", "www.ppice.com");
conn.connect();

os = conn.getOutputStream();
InputStream bmis = getResources().openRawResource(R.drawable.icon);
int i = 0;
while (i != -1) {
i = bmis.read();
os.write(i);
}
bmis.close();
os.flush();
os.close();

is = conn.getInputStream();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这段代码的功能是:向一个Servlet发送一张图片,定义了OutputStream和InputStream,其实这里InputStream本用不 着,但是如果不执行is=conn.getInputStream(),就发不出数据,不知道这是android的bug,还是规定。


Android学习心得(五)——GOOGLE MAPGOOGLE MAP API是Android的靓点之一,我们可以创建一个MapActivity的子类,将MapView显示于其上即可,可以用MapController来控制显示的坐标、地图模式和视野高度,处理起来非常简单。
完整代码如下:
public class MapTest extends MapActivity {
private MapView mapView;
private MapController mc;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapview);

mapView = (MapView) findViewById(R.id.map);
mapView.setTraffic(true);
mc = mapView.getController();

GeoPoint gp = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000)); //地理坐标
mc.animateTo(gp);
mc.setZoom(12);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}
}
mapview.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.google.android.maps.MapView android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0mHnPl2NS9XPKx6pKwJriV2Wj-mEHSh71yyX_SQ"
/>
</RelativeLayout>

注意:
1、你要申请一个自己的apiKey;
2、不要忘了设置互联网访问权限。

(作者:子轩,邮箱:)
Android学习心得(六)——位置服务本节主要是介绍一下gps的使用,google map和gps的结合是android上主要应用之一,android market中,此类产品所占比例不小。
我们在上节的代码中添加如下内容:
LocationManager lm;
MyLocationListener locationListener;
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
缺少MyLocationListener吧?那我们就创建一个MyLocationListener,要实现LocationListener中的几个方法,LocationListener的功能我就不用再说了吧?
我吧代码贴出来,一目了然。
// 下面是从GPS获取坐标的监听,暂时没有使用
public class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
if (loc != null) {
Log.d("MapTest", "Location changed : Lat: " + loc.getLatitude() + " Lng: " + loc.getLongitude());

GeoPoint p = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc.getLongitude() * 1E6));
mc.animateTo(p);
mc.setZoom(16);
mapView.invalidate();
}
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}

注意事项:
又是权限的问题,我全列出来,随便用哪个了。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

(作者:子轩,邮箱:)
Android学习心得(七)——SQLite众所周知,移动设备上的数据库最成功的非SQLite莫属了,Android上同样是用SQLite,并且android提供了较为简单的API,用起来非常顺手。
看下面的代码:

//定义数据库
SQLiteDatabase myDB = null;
//打开或建立数据库(当数据库不存在时,自动分创建)
myDB = this.openOrCreateDatabase("MY_DATABASE_NAME", "MODE_PRIVATE", null);

//删除表格、新建表格、插入数据、更新数据,地球人都知道,我也不说了
myDB.execSQL("........标准的SQL语句..........;");

//查询比较麻烦,我这里列出代码
//查询(表格和数据你自己去建立吧)
Cursor c = myDB.rawQuery("SELECT id,name,tel FROM MY_DATABASE_TABLE WHERE age>1 order by age;", null);
if (c != null) {
if (c.moveToFirst()) {
do {
Log.w("test", "id="+c.getString(c.getColumnIndex("id")));
Log.w("test", "name="+c.getString(c.getColumnIndex("name")));
Log.w("test", "tel="+c.getString(c.getColumnIndex("tel")));
Log.w("test", "--------------");
} while (c.moveToNext());
}
}
c.close();

//关装闭数据库
myDB.close();

怎么样?比jdbc要简单得多吧?移动设置上功能不需要太强大,好用就好。

(作者:子轩,邮箱:)
Android学习心得(八)——多媒体播放先看代码:
try {
String path = "/sdcard/t.mp3";
MediaPlayer mp = null;
mp = new MediaPlayer();
mp.setDataSource(path);
mp.prepare();
mp.start();
mp.setOnCompletionListener(cl);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
音频播放,就是这么简单。
视频播放用VideoView,也不是很复杂。

我还是把代码加上吧,不然老感觉不完整。
VideoView videoView = new VideoView(this);
setContentView(videoView);
videoView.setVideoURI(Uri.parse("/sdcard/t.3gp"));
videoView.requestFocus();
videoView.start();


ndroid学习心得(九)——多媒体录制还是先看代码,用一种最笨的方式实现了录音的功能:
try {
String path = "/sdcard/recorder.amr";
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path+name);
recorder.prepare();
recorder.start();
try {
Runnable.wait(10000);
} catch (Exception exp) {
exp.printStackTrace();
}
recorder.stop();
recorder.release();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
10秒钟哦,等也得等,不等也得等,不用线程怎么行。

录像就是Audio+Video,所以还要加点东西,看代码:
path = "/sdcard/v.3gp";
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoSize(176, 144);
recorder.setVideoFrameRate(15);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
理论上是没错的,可我用模拟器测试录制视频还是会报错,G2已经上市,看来是时候弄部真机了。

(作者:子轩,邮箱:)
ndroid学习心得(十)——拍照拍照有两种方式,一是使用android.hardware.Camera,二是使用Intent("android.media.action.IMAGE_CAPTURE"),当然还是第一种好,不过代码太复杂,以后有时间再说,这里就说一下第二种方式吧。
try {
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);
} catch (Exception e) {
}
这样就可以调用系统的像机了。
当然你的Activity要重构一下onActivityResult方法,代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

Bundle extras = data.getExtras();
Bitmap b = (Bitmap) extras.get("data");

ImageView img = new ImageView(this);
img.setImageBitmap(b);
setContentView(img);
}
这样,你拍到的照片就可以显示在ImageView中了。当然,你也可以保存这个Bitmap到文件。
经测试,SDK 1.5版中,测试出错,大概是因为用的是模拟器吧,SDK 1.1版中,程序可以拍到照片,但是尺寸有点小,不知道为什么。这里,我没有怀疑自己,应该是Android的bug,也或者是我没有找在设置图片尺寸的 地方,如果哪位找到了解决办法,也麻烦通知我一下,我的邮箱就在下面。

Android学习心得(附1)——屏幕显示设置程序中默的显示是带有标题栏和系统信息栏的,有的时候,这很影响程序界面的美观。手机默认的是竖屏,或与感应器状态相关,为了某种效果,我们的程序需要限制使用横屏或竖屏。以下的代码就解决了上述问题。

//设置为无标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置为横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Android学习心得(附2)——Intent参数传递当Activity与Activity/Service(或其它情况)有时与要进行参数传递,最常用也是最简单的方式就是通过Intent来处理。
看如下代码:
Intent intent = new Intent(...);
Bundle bundle = new Bundle();
bundle.putString("NAME", "zixuan");
intent.putExtras(bundle);
context.startActivity(intent); 或 context.startService(intent);

当然,有传送就有接收,接收也很简单,如:
Bundle bunde = intent.getExtras();
String name = bunde.getInt("NAME");
当然参数KEY要与传送时的参数一致。

Android学习心得(附3)——获取手机号/手机串号在j2me中,根本没有办法获取用户的手机号码,就连获取手机串号(IMEI)都基本上无法实现,然后在android手机上一切都是如此的简单,看代码:
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String tel = tm.getLine1Number();
看来,android的确加速了j2me的消亡。

Android学习心得(附4)——振动器总感觉手机上的振动器没有多大用处(当然静音模式下的振铃很有用),但还是顺带着说一下吧,只有两行代码:
1、获取振动服务的实例
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
2、设置振动时长,单位当然也是ms
vibrator.vibrate(1000);
如果你觉得这样过去单调的话,可以设个节奏:
vibrator.vibrate(new long[]{10, 100, 20, 200}, -1);
两个参数,习惯告诉我第一个是节奏,第二个是重复次数,可事实并没有这么简单,我翻译不好,大家还是看原文吧:
public void vibrate (long[] pattern, int repeat)
pattern: an array of longs of times to turn the vibrator on or off.
repeat: the index into pattern at which to repeat, or -1 if you don't want to repeat.
google喜欢弄些技巧,我却觉得这里有点弄巧成拙了。


Android学习心得(附5)——闹钟最近看了一下Android的闹钟管理类(AlarmManager),真不错误,强大又简单,代码如下:

1、建立一个AlarmReceiver继承入BroadcastReceiver,并在AndroidManifest.xml声明
public static class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "闹钟提示:时间到!", Toast.LENGTH_LONG).show();
}
}

2、建立Intent和PendingIntent,来调用目标组件。
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

3、设置闹钟
获取闹钟管理的实例:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
设置单次闹钟:
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000), pendingIntent);
设置周期闹钟:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);

搞定!当然这里闹钟的响应处理只是用的文字,你可以播放声音,或都用更复杂的一系统通知,在这里你就是上帝,一切由你做主。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值