Android 屏幕设置:横屏/全屏模式/坚屏

在看书学习的时候,看到了手机的全屏显示,需要这样设置:

//设置为没有标题栏:

requestWindowFeature(Window.FEATURE_NO_TITLE); 

//设置为全屏模式:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   

//设置为横屏: 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  

 

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 7647    2 Comments

Android 简单的照相机程序

终于经过多次找错,修改把一个简单的照相机程序完成了,照相类代码如下:

1 classsurfaceextendsSurfaceViewimplementsSurfaceHolder.Callback {
2
3 SurfaceHolder sfholder;
4
5 Camera camera;
6
7 Bitmap bitmap;
8
9 publicsurface(Context context) {
10 super(context);
11 //TODO Auto-generated constructor stub
12  
13 sfholder=getHolder();
14 sfholder.addCallback(this);
15 sfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
16 }
17
18 publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,
19 intheight) {
20 //TODO Auto-generated method stub
21  Camera.Parameters parameters=camera.getParameters();
22 parameters.setPictureFormat(PixelFormat.JPEG);
23 parameters.setPreviewSize(320,480);
24 parameters.setPictureSize(320,480);
25 camera.setParameters(parameters);
26 camera.startPreview();
27 }
28
29 publicvoidsurfaceCreated(SurfaceHolder holder) {
30 //TODO Auto-generated method stub
31  
32 try{
33 camera=Camera.open();
34 camera.setPreviewDisplay(sfholder);
35 }catch(Exception e) {
36 camera.release();
37 camera=null;
38 }
39 }
40
41 publicvoidsurfaceDestroyed(SurfaceHolder holder) {
42 //TODO Auto-generated method stub
43  camera.stopPreview();
44 camera=null;
45
46 }
47 //拍照
48 publicvoidtakePicture()
49 {
50 if(camera!=null)
51 {
52 camera.takePicture(null,null, jpegCallback);
53 }
54 }
55
56 //拍照并且保存的回调函数
57  
58 privatePictureCallback jpegCallback=newPictureCallback() {
59
60 publicvoidonPictureTaken(byte[] data, Camera camera) {
61 //TODO Auto-generated method stub
62 try
63 {
64 bitmap=BitmapFactory.decodeByteArray(data,0, data.length);
65 File file=newFile("/sdcard/camera1.jpg");
66 BufferedOutputStream bos=newBufferedOutputStream(newFileOutputStream(file));
67 bitmap.compress(Bitmap.CompressFormat.JPEG,80, bos);
68 bos.flush();
69 bos.close();
70 Canvas canvas=sfholder.lockCanvas();
71 canvas.drawBitmap(bitmap,0,0,null);
72 sfholder.unlockCanvasAndPost(canvas);
73 }
74 catch(Exception e)
75 {
76 e.printStackTrace();
77 }
78 }
79 }
80 }

 这个是一个拍照的类,使用的是SurfaceView来实现的,如果想要在一部分上显示,并且使用按钮操作的话,可以修改一下这个类,而且这个是拍照之后停留在拍照页面的,如果需要在拍照后不停留在拍照页面的,可以自行修改和添加参数。

 此程序也演示了,如何在拍完照之后,将照片保存到SD卡上。

实际使用时的操作如何,使用的是按键进行拍照的,其实也可以改为使用按钮进行拍照的,只要对这个类进行简单的修改即可。调用如下:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
sf.takePicture();
return super.onKeyDown(keyCode, event);
}

 要使用相机和操作SD卡,则需要添加以下权限: 

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permissionandroid:name="android.permission.CAMERA"></uses-permission>

 第一条是可以使用扩展存储设备的权限 

第二条是可以使用照相机设备

如果没有这两条权限的话,会报错,具体错误可以在DDMS中查看 。欢迎交流!

希望对大家有所帮助 ! 

此平台使用提Android2.2 V8的系统,如果使用1.5或者是其它的,权限可能会不一样!

 

当然更好的方法是首先检查SD卡是否存在,此程序中没有进行检测,因为我只是在练习相机的使用。

检测代码如下:

 

代码

if(Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
File sdcardPath
=Environment.getExternalStorageDirectory();
setTitle(sdcardPath.getName());
//将SD卡路径名字设置为标题,只是为了让大家看的更明白些
}else{
Toast.makeText(RecordTest.
this,"没有SD卡",1000).show();
}

 

 

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 3832    No Comments

Android 检测目录是否存在,不存在则创建

方法如下:我们假设SD卡是存在的,如果要检测SD卡是否存在,请参考前面的关于录音的文章,里面有具体的内容,和使用SD卡需要添加的权限,否则无法操作扩展存储设备

1.只创建一级目录的形式为:

例如:只在SD卡上建立一级目录("/sdcard/audio/"):

booleanisFolderExists(String strFolder)
{
File file
=newFile(strFolder);

if(!file.exists())
{
if(file.mkdir())
{
returntrue;
}
else
returnfalse;
}
returntrue;
}

2.建立多级目录的形式如下:

例如:在SD卡上建立多级目录("/sdcard/meido/audio/"):

 

代码

booleanisFolderExists(String strFolder) {
File file
=newFile(strFolder);
if(!file.exists()) {
if(file.mkdirs()) {
returntrue;
}
else{
returnfalse;

}
}
returntrue;

}

 

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 4095    No Comments

Android GPS 定位的实现

今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助。具体代码如下:  要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:   

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

 具体实现代码如下:

首先判断GPS模块是否存在或者是开启: 

privatevoidopenGPSSettings() {
LocationManager alm
=(LocationManager)this
.getSystemService(Context.LOCATION_SERVICE);
if(alm
.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
Toast.makeText(
this,"GPS模块正常", Toast.LENGTH_SHORT)
.show();
return;
}

Toast.makeText(
this,"请开启GPS!", Toast.LENGTH_SHORT).show();
Intent intent
=newIntent(Settings.ACTION_SECURITY_SETTINGS);
startActivityForResult(intent,
0);//此为设置完成后返回到获取界面

}

 如果开启正常,则会直接进入到显示页面,如果开启不正常,则会进行到GPS设置页面:

查看更多内容...

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 3641    No Comments

Android 文件的上传

一个文件上传的内容的实现,Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易造成数据丢失,因此在这里选择了Web进行上传,使用Web进行上传是模拟的Http Post上传数据,当然,Post上传数据的类,在网上找了一找,方式虽然很多,但是没有一个感觉是我所使用的,所以参照原理之类的,进行了一下修改,算是做了一个参考。并且利用这个类完成了文件和表彰的上传服务。

具体代码如下:

文件与表单上传类: 

packagecom.UpLoadFileTest;

importjava.io.BufferedReader;
importjava.io.DataOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;

importjava.io.InputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;

importjava.util.Map;

publicclassPostFile {
//上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定
publicstaticString post(String actionUrl, Map<String, String>params,
Map
<String, File>files)throwsIOException {

String BOUNDARY
=java.util.UUID.randomUUID().toString();
String PREFIX
="--", LINEND="\r\n";
String MULTIPART_FROM_DATA
="multipart/form-data";
String CHARSET
="UTF-8";

URL uri
=newURL(actionUrl);
HttpURLConnection conn
=(HttpURLConnection) uri.openConnection();

conn.setReadTimeout(
5*1000);
conn.setDoInput(
true);//允许输入
conn.setDoOutput(true);//允许输出
conn.setUseCaches(false);
conn.setRequestMethod(
"POST");//Post方式
conn.setRequestProperty("connection","keep-alive");
conn.setRequestProperty(
"Charsert","UTF-8");

conn.setRequestProperty(
"Content-Type", MULTIPART_FROM_DATA
+";boundary="+BOUNDARY);


//首先组拼文本类型的参数
StringBuilder sb=newStringBuilder();
for(Map.Entry<String, String>entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append(
"Content-Disposition: form-data; name=\""
+entry.getKey()+"\""+ LINEND);
sb.append("Content-Type: text/plain; charset="+CHARSET+LINEND);
sb.append(
"Content-Transfer-Encoding: 8bit"+LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}

DataOutputStream outStream
=newDataOutputStream(conn
.getOutputStream());
outStream.write(sb.toString().getBytes());
//发送文件数据
if(files!=null)
for(Map.Entry<String, File>file : files.entrySet()) {
StringBuilder sb1
=newStringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1
.append(
"Content-Disposition: form-data; name=\"file\"; filename=\""
+file.getKey()+"\""+ LINEND);
sb1.append("Content-Type: application/octet-stream; charset="
+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());

InputStream is
=newFileInputStream(file.getValue());
byte[] buffer=newbyte[1024];
intlen=0;
while((len=is.read(buffer))!=-1) {
outStream.write(buffer,
0, len);
}

is.close();
outStream.write(LINEND.getBytes());
}

//请求结束标志
byte[] end_data=(PREFIX+BOUNDARY+PREFIX+LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
//得到响应码
intres=conn.getResponseCode();
InputStream in
=conn.getInputStream();
InputStreamReader isReader
=newInputStreamReader(in);

BufferedReader bufReader
=newBufferedReader(isReader);

String line
=null;
String data
="OK";
while((line=bufReader.readLine())==null)
data
+=line;

if(res==200) {
intch;
StringBuilder sb2
=newStringBuilder();
while((ch=in.read())!=-1) {
sb2.append((
char) ch);
}
}
outStream.close();
conn.disconnect();
returnin.toString();
}

}

以上如果要写入(上传)数据,这里使用的是out.write亦可使用out.wrtebyte(content)这样子也可以,省得在这里转换了,交给系统进行转换

这个可以根据个人的需要,加上等待条等等,如果要加上等待条的话,需要使用发送消息的方式进行,这个是我所想到的,其它的方式没有考虑好呢,有兴趣的人可以自己加上去!我在这里不再给增加了,增加的话,将在下载中添加一个下载的进度提示条。 

实现内容如下:


Button btn1;

EditText view1;
EditText text1;
String SDPath
="/sdcard/";

/**Called when the activity is first created.*/
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view1
=(EditText) findViewById(R.id.view1);
text1
=(EditText) findViewById(R.id.edit1);
btn1
=(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(
newView.OnClickListener() {

@Override
publicvoidonClick(View v) {
//TODO Auto-generated method stub
getFile();
try{
String name
=URLEncoder.encode(text1.getText().toString(),"utf-8");
Map
<String, String>params=newHashMap<String, String>();
params.put(
"NAME", name);
Map
<String, File>files=newHashMap<String, File>();
files.put(getFile(),
newFile("/sdcard/"+getFile()));
view1.setText(PostFile.post(
"http://wdsl.recordinfo.tk/default.aspx", params, files));
}
catch(Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}

}
});
}

String getFile() {
File file
=newFile(SDPath);
File[] files
=file.listFiles(newfileFilter());
String filename
="";
for(File file1 : files) {
filename
=file1.getName();
}

Toast.makeText(
this, filename, Toast.LENGTH_LONG).show();
returnfilename;
}

classfileFilterimplementsFilenameFilter {

@Override
publicbooleanaccept(File dir, String filename) {
//TODO Auto-generated method stub
returnfilename.endsWith(".gif");
}

}

 这些只是类里面的内容,并且我只取了SD卡上的一张照片,因此我就在卡上放了一张照片,所以没有进行列表处理,有兴趣的话,可以自己添加上去,因为我主要是实现这一功能,对这一功能进行练习! 

 要使用SD卡和网络,相应的权限需要加上,

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 4195    No Comments

Android 文件的下载

下载文件与打开网页是一样的,打开网页是将内容显示出来,保存文件就是保存到文件中即可。

实现的代码基本如下:

publicvoiddownFile(String url, String path, String fileName)
throwsIOException {
if(fileName==null||fileName=="")
this.FileName=url.substring(url.lastIndexOf("/")+1);
else
this.FileName=fileName;//取得文件名,如果输入新文件名,则使用新文件名

URL Url
=newURL(url);
URLConnection conn
=Url.openConnection();
conn.connect();
InputStream is
=conn.getInputStream();
this.fileSize=conn.getContentLength();//根据响应获取文件大小
if(this.fileSize<=0) {//获取内容长度为0
thrownewRuntimeException("无法获知文件大小");
}
if(is==null) {//没有下载流
sendMsg(Down_ERROR);
thrownewRuntimeException("无法获取文件");
}
FileOutputStream FOS
=newFileOutputStream(path+this.FileName);//创建写入文件内存流,通过此流向目标写文件

bytebuf[]=newbyte[1024];
downLoadFilePosition
=0;

intnumread;

while((numread=is.read(buf))!=-1) {
FOS.write(buf,
0, numread);
downLoadFilePosition
+=numread


}



try{
is.close();
}
catch(Exception ex) {
;
}

}

 通过此代码就可以实现将内容保存到SD卡等设备上,当然要使用网络,必须得有网络的访问权限。这个需要自己添加,在这里不再添加! 

上面的代码没有实现进度条功能,如果要实现进度条功能,我现在考虑到的就是使用消息进行发送提示,首先实现一个消息。

privateHandler downloadHandler=newHandler() {//用于接收消息,处理进度条
@Override
publicvoidhandleMessage(Message msg) {//接收到的消息,并且对接收到的消息进行处理
if(!Thread.currentThread().isInterrupted()) {
switch(msg.what) {
caseDOWN_START:
pb.setMax(fileSize);
//设置开始长度
caseDOWN_POSITION:
pb.setProgress(downLoadFilePosition);
//设置进度
break;
caseDOWN_COMPLETE:
Toast.makeText(DownLoadFileTest.
this,"下载完成!",1).show();//完成提示
break;

caseDown_ERROR:
String error
=msg.getData().getString("下载出错!");
Toast.makeText(DownLoadFileTest.
this, error,1).show();
break;
}
}
super.handleMessage(msg);
}
};

 这样,在下载的时候只要发送相应的消息,即可有相应的提示!

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 2966    No Comments

Android 使用三种方式获取网页(通过Post,Get进行表单的提交)

在这里把三种获取网页内容的信息进行了综合,在前面已经对通过表单提交上传文件进行了处理,现在把这三种方式进行了综合,放到一块,帮助大家进行一个比较,下面为三种方式 的部分代码:

一共三个函数,都可以直接调用,但是在访问网络的时候,记得要加上访问权限 

//直接获取信息
voidDirectInfo()throwsIOException {

URL url
=newURL(SRC);

HttpURLConnection httpConn
=(HttpURLConnection) url.openConnection();

InputStreamReader inStreamReader
=newInputStreamReader(httpConn
.getInputStream());

BufferedReader bufReader
=newBufferedReader(inStreamReader);

String line
="";
String Date
="OK";
while((line=bufReader.readLine())!=null) {
Date
+=line+"\n";
}

edit1.setText(Date);

}

//get方式获取信息
voidgetInfo()throwsIOException {
//将上面使用的方法直接修改一下即可。

URL url
=newURL(SRC+"/default.aspx?NAME="
+URLEncoder.encode("abc","utf-8"));
HttpURLConnection httpconn
=(HttpURLConnection) url.openConnection();

InputStreamReader inputReader
=newInputStreamReader(httpconn
.getInputStream());

BufferedReader bufReader
=newBufferedReader(inputReader);

String line
="";
String Date
="";

while((line=bufReader.readLine())!=null) {
Date
+=line;
}

edit1.setText(Date);

}

//Post方式获取信息
voidpostInfo()throwsMalformedURLException, IOException {
//Post 方法比Get方法需要设置的参数更多

HttpURLConnection httpconn
=(HttpURLConnection)newURL(SRC)
.openConnection();
//post 方式,输入输出需要设置为true
httpconn.setDoInput(true);
httpconn.setDoOutput(
true);
httpconn.setRequestMethod(
"POST");//设置为Post方式,默认为get方式
httpconn.setUseCaches(false);//不使用缓存
httpconn.setInstanceFollowRedirects(true);//重定向
httpconn.setRequestProperty("Content-type",
"Application/x-www-form-urlencoded");//设置连接 的Content-type类型为:
//application/x-www-form-urlencoded
httpconn.connect();//连接

DataOutputStream out
=newDataOutputStream(httpconn.getOutputStream());//声明数据写入流

String content
="NAME="+URLEncoder.encode("fly_binbin","gb2312");

out.writeBytes(content);

out.flush();
out.close();

BufferedReader reader
=newBufferedReader(newInputStreamReader(httpconn.getInputStream()));

String line
="";
String resultDate
="";
while((line=reader.readLine())!=null)
{
resultDate
+=line;
}
edit1.setText(resultDate);

}

 网址的话,可以自己做一个测试服务器。我这个测试服务器是我自己写的,进行测试用的,用Asp.net写的,用其它的方法写的结果是一样的。包括使用Web服务结果也是一样的!

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 4506    No Comments

Android 检查网络状态

在使用Android连接网络的时候,并不是每次都能连接到网络,在这个时候,我们最好是在程序启动的时候对网络的状态进行一下判断,如果没有网络则进行即时提醒用户进行设置。

要判断网络状态,首先需要有相应的权限,下面为权限代码:

即允许访问网络状态:

 

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

查看更多内容...

Posted in 手机相关 at July 9, 2011. by 傻猫 .    Views: 6680    1 Comment