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

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

      //设置为没有标题栏:

      requestWindowFeature(Window.FEATURE_NO_TITLE); 

      //设置为全屏模式:

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

      //设置为横屏: 

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  

       

    • 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();
      }

       

       

    • 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;

      }

       

    • 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设置页面:

      阅读剩余部分...

    • 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卡和网络,相应的权限需要加上,

    • 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);
      }
      };

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

    • 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服务结果也是一样的!

    • Android 检查网络状态

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

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

      即允许访问网络状态:

       

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

      阅读剩余部分...

    • Android Wifi简单管理与操作

    • 因为需要一直在弄网络的问题,今天看了一下Wifi的操作,经过整理,做出来了一个类,可能不全,但是个人感觉已经完全能够满足需要了,当然,里面的方法也有可能是错误的或者是不全的,这个类我没有进行完整的测试,只测试了其中的一些方法。

      其实操作Wifi也是很简单的,主要使用以下几个对象或变量:

       private WifiManager wifiManager;// 声明管理对象OpenWifi
      private WifiInfo wifiInfo;// Wifi信息
      private List<ScanResult> scanResultList; // 扫描出来的网络连接列表
      private List<WifiConfiguration> wifiConfigList;// 网络配置列表
      private WifiLock wifiLock;// Wifi锁

      阅读剩余部分...

    • Android 读取资源文件下面的文件

    • 今天在读取文件的时候,突然想了一下,如果文件是放在raw目录下面应该怎么读取呢? 

      需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作 

      以下为从Raw文件中读取:

      publicString getFromRaw(){
      try{

      InputStreamReader inputReader
      =newInputStreamReader( getResources().openRawResource(R.raw.test1));

      BufferedReader bufReader
      =newBufferedReader(inputReader);

      String line
      ="";
      String Result
      ="";

      while((line=bufReader.readLine())!=null)
      Result
      +=line;
      returnResult;
      }
      catch(Exception e) {
      e.printStackTrace();
      }
      }

       

       

      以下为直接从assets读取

       

       

      代码

      publicString getFromAssets(String fileName){
      try{
      InputStreamReader inputReader
      =newInputStreamReader( getResources().getAssets().open(fileName) );

      BufferedReader bufReader
      =newBufferedReader(inputReader);

      String line
      ="";
      String Result
      ="";

      while((line=bufReader.readLine())!=null)
      Result
      +=line;
      returnResult;
      }
      catch(Exception e) {
      e.printStackTrace();
      }
      }

       当然如果你要得到内存流的话也可以直接返回内存流!

Powered by Typecho)))   ICP:蜀ICP备05009250号