新浪微博开发之发表微博功能的实现

来源:互联网 发布:windows阻止软件安装 编辑:程序博客网 时间:2024/06/05 10:04

转自:http://blog.csdn.net/shang_515/article/details/7420049

发表微博的功能其实很简单,我们只需要调用SDK中的方法即可。稍微麻烦一点的是发表包含图片的微博,今天主要介绍如何获取图片路径,并实现发表带图片的微博。

先说一下我的思路:当用户点击添加图片按钮时,我实现了两种方法一是调用摄像头,另一种方法是使用系统图库打开图片。两种方法都是返回图片路径,通过图片路径我们可以读取图片,然后上传到服务器上即可实现发布带图片的微博。

发表微博界面:


用户点击插入图片按钮后调用showMenuDialog()方法:

[java] view plaincopy
  1. private void showMenuDialog() {  //获取图片路径  
  2.         View menuView = View.inflate(UpdateStatus.this, R.layout.upload_dialog_menu, null);  
  3.         final AlertDialog menuDialog = new AlertDialog.Builder(UpdateStatus.this)  
  4.         .setView(menuView)  
  5.         .setTitle("插入图片")  
  6.         .setIcon(R.drawable.ic_upload_photo)  
  7.         .create();  
  8.         menuDialog.show();  
  9.         menuView.findViewById(R.id.camera).setOnClickListener(new OnClickListener() {  
  10.               
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 menuDialog.dismiss();  
  14.                 Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");//使用照相机  
  15.                 startActivityForResult(intentCamera, Activity.DEFAULT_KEYS_DIALER);  
  16.             }  
  17.         });  
  18.         menuView.findViewById(R.id.picture).setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                  menuDialog.dismiss();  
  23.                  Intent intent = new Intent();    
  24.                     /* 开启Pictures画面Type设定为image */    
  25.                  intent.setType("image/*");    
  26.                     /* 使用Intent.ACTION_GET_CONTENT这个Action */    
  27.                  intent.setAction(Intent.ACTION_GET_CONTENT);     
  28.                     /* 取得相片后返回本画面 */    
  29.                  startActivityForResult(intent, 2);  
  30.             }  
  31.         });  
  32.     }  


   

为了获取图片路径,我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)方法:

[java] view plaincopy
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         if (resultCode == RESULT_OK) {   
  4.             if(null == data){  
  5.                 ToastUtil.showToast(this"添加图片失败!");  
  6.                 return;  
  7.             }  
  8.             Uri thisUri = data.getData();  
  9.             fileName = getRealPathFromURI(thisUri);   //通过uri获取图片路径  
  10.         }    
  11.         super.onActivityResult(requestCode, resultCode, data);  
  12.     }  

getRealPathFromURI( )方法如下:
[java] view plaincopy
  1. /** 
  2.       * 通过Uri获取文件在本地存储的真实路径 
  3.       * @param act 
  4.       * @param contentUri 
  5.       * @return 
  6.       */  
  7.      private String getRealPathFromURI(Uri uri) {  
  8.           // can post image  
  9.         //指定获取的列   
  10.          String columns[] = new String[]{ Media.DATA, Media._ID, Media.TITLE, Media.DISPLAY_NAME };   
  11.   
  12.          Cursor cursor = this.managedQuery(uri, columns, // Which columns to return  
  13.             null// WHERE clause; which rows to return (all rows)  
  14.             null// WHERE clause selection arguments (none)  
  15.             null); // Order-by clause (ascending by name)  
  16.          int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);  
  17.          cursor.moveToFirst();  
  18.          return cursor.getString(column_index);  
  19.      }  

获取到了图片路径,我们就可以读取图片了。之后我们就可以发表微博了。发表微博的方法:

[java] view plaincopy
  1. /** 
  2.      * 发布微博 
  3.      * 微博内容不能为空且字数小于140 
  4.      */  
  5.     private void updateStatus() {  
  6.         String statusText = statusEditText.getText().toString();  
  7.         if("".equals(statusText) && statusText.length() > 140){  //微博内容不能为空且字数小于140.  
  8.             AlertDlgUtil.alertDialog(UpdateStatus.this);//  为空时提示  
  9.         }else{  
  10.             if(statusText.length() > 140){  
  11.                 ToastUtil.showToast(this"字数不能多于140!");  //大于140个字符时  
  12.             }  
  13.             if(CheckNetUtil.checkNet(UpdateStatus.this)){  //检查网络是否可用  
  14.                 if("".equals(fileName)){  //不包含图片时  
  15.                     thread = new ServerThread(weibo, statusText, false, handler);  
  16.                     thread.start();  
  17.                       
  18.                 }else{  
  19.                           
  20. //                  System.out.println("fileName------->: " + fileName);  
  21.                     byte[] content = ImageReaderUtil.readFileImage(fileName);//包含图片时  
  22. //                  System.out.println("content length:" + content.length);  
  23.                     ImageItem pic = new ImageItem("pic",content);  
  24.                           
  25.                         String s = java.net.URLEncoder.encode(statusText, "utf-8");  
  26.                         thread = new ServerThread(weibo, s, pic, true, handler);  
  27.                         thread.start();  
  28.                 }  
  29.             }else{  
  30.                 AlertDlgUtil.alertDialogNetErr(UpdateStatus.this);  
  31.             }  
  32.               
  33.         }  
  34.     }  

发表微博的功能其实很简单,我们只需要调用SDK中的方法即可。稍微麻烦一点的是发表包含图片的微博,今天主要介绍如何获取图片路径,并实现发表带图片的微博。

先说一下我的思路:当用户点击添加图片按钮时,我实现了两种方法一是调用摄像头,另一种方法是使用系统图库打开图片。两种方法都是返回图片路径,通过图片路径我们可以读取图片,然后上传到服务器上即可实现发布带图片的微博。

发表微博界面:


用户点击插入图片按钮后调用showMenuDialog()方法:

[java] view plaincopy
  1. private void showMenuDialog() {  //获取图片路径  
  2.         View menuView = View.inflate(UpdateStatus.this, R.layout.upload_dialog_menu, null);  
  3.         final AlertDialog menuDialog = new AlertDialog.Builder(UpdateStatus.this)  
  4.         .setView(menuView)  
  5.         .setTitle("插入图片")  
  6.         .setIcon(R.drawable.ic_upload_photo)  
  7.         .create();  
  8.         menuDialog.show();  
  9.         menuView.findViewById(R.id.camera).setOnClickListener(new OnClickListener() {  
  10.               
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 menuDialog.dismiss();  
  14.                 Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");//使用照相机  
  15.                 startActivityForResult(intentCamera, Activity.DEFAULT_KEYS_DIALER);  
  16.             }  
  17.         });  
  18.         menuView.findViewById(R.id.picture).setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                  menuDialog.dismiss();  
  23.                  Intent intent = new Intent();    
  24.                     /* 开启Pictures画面Type设定为image */    
  25.                  intent.setType("image/*");    
  26.                     /* 使用Intent.ACTION_GET_CONTENT这个Action */    
  27.                  intent.setAction(Intent.ACTION_GET_CONTENT);     
  28.                     /* 取得相片后返回本画面 */    
  29.                  startActivityForResult(intent, 2);  
  30.             }  
  31.         });  
  32.     }  


   

为了获取图片路径,我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)方法:

[java] view plaincopy
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         if (resultCode == RESULT_OK) {   
  4.             if(null == data){  
  5.                 ToastUtil.showToast(this"添加图片失败!");  
  6.                 return;  
  7.             }  
  8.             Uri thisUri = data.getData();  
  9.             fileName = getRealPathFromURI(thisUri);   //通过uri获取图片路径  
  10.         }    
  11.         super.onActivityResult(requestCode, resultCode, data);  
  12.     }  

getRealPathFromURI( )方法如下:
[java] view plaincopy
  1. /** 
  2.       * 通过Uri获取文件在本地存储的真实路径 
  3.       * @param act 
  4.       * @param contentUri 
  5.       * @return 
  6.       */  
  7.      private String getRealPathFromURI(Uri uri) {  
  8.           // can post image  
  9.         //指定获取的列   
  10.          String columns[] = new String[]{ Media.DATA, Media._ID, Media.TITLE, Media.DISPLAY_NAME };   
  11.   
  12.          Cursor cursor = this.managedQuery(uri, columns, // Which columns to return  
  13.             null// WHERE clause; which rows to return (all rows)  
  14.             null// WHERE clause selection arguments (none)  
  15.             null); // Order-by clause (ascending by name)  
  16.          int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);  
  17.          cursor.moveToFirst();  
  18.          return cursor.getString(column_index);  
  19.      }  

获取到了图片路径,我们就可以读取图片了。之后我们就可以发表微博了。发表微博的方法:

[java] view plaincopy
  1. /** 
  2.      * 发布微博 
  3.      * 微博内容不能为空且字数小于140 
  4.      */  
  5.     private void updateStatus() {  
  6.         String statusText = statusEditText.getText().toString();  
  7.         if("".equals(statusText) && statusText.length() > 140){  //微博内容不能为空且字数小于140.  
  8.             AlertDlgUtil.alertDialog(UpdateStatus.this);//  为空时提示  
  9.         }else{  
  10.             if(statusText.length() > 140){  
  11.                 ToastUtil.showToast(this"字数不能多于140!");  //大于140个字符时  
  12.             }  
  13.             if(CheckNetUtil.checkNet(UpdateStatus.this)){  //检查网络是否可用  
  14.                 if("".equals(fileName)){  //不包含图片时  
  15.                     thread = new ServerThread(weibo, statusText, false, handler);  
  16.                     thread.start();  
  17.                       
  18.                 }else{  
  19.                           
  20. //                  System.out.println("fileName------->: " + fileName);  
  21.                     byte[] content = ImageReaderUtil.readFileImage(fileName);//包含图片时  
  22. //                  System.out.println("content length:" + content.length);  
  23.                     ImageItem pic = new ImageItem("pic",content);  
  24.                           
  25.                         String s = java.net.URLEncoder.encode(statusText, "utf-8");  
  26.                         thread = new ServerThread(weibo, s, pic, true, handler);  
  27.                         thread.start();  
  28.                 }  
  29.             }else{  
  30.                 AlertDlgUtil.alertDialogNetErr(UpdateStatus.this);  
  31.             }  
  32.               
  33.         }  
  34.     }