您的位置:首页 > 移动开发 > Android开发

Android学习心得

2012-11-10 18:07 309 查看

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
= SmsMessage.createFromPdu((byte[]) pdusObj
);

Log.d("MsgTest", "Message: " + n + " " + messages
.getMessageBody());

Log.d("MsgTest", "Message from: " + messages
.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);

搞定!当然这里闹钟的响应处理只是用的文字,你可以播放声音,或都用更复杂的一系统通知,在这里你就是上帝,一切由你做主。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: