OPPO R9怎么使用 OPPO R9使用技巧介绍

 更新时间:2017年1月22日 11:05  点击:1781
本篇文章介绍了oppo R9的一些使用技巧,如果恰巧你也在使用同款手机,那就赶快进来看一看吧。

在国内,OPPO R9备受忠实用户的喜欢,这款手机除了颜值高以外,功能也是相当的丰富,还有很多值得我们挖掘的地方,那么OPPO R9怎么使用呢?接下来,小编就为大家带来OPPO R9使用技巧介绍。

OPPO R9怎么使用

OPPO R9使用指南:

1、自拍新体验,前置全景拍摄

对于一些喜欢自拍的小女生而言,在没有自拍神器的情况下,自拍出来照片就像范冰冰的武媚娘,都是“大头照”,身后的美景,身边的朋友都被无情的切割了。但使用OPPO手机就不一样了,OPPO R9的前置自拍模式还隐藏着很多不为人知的功能,用好这些功能会让照片充满趣味性。其中就有一项非常有趣的功能那就是前置全景拍摄。不需要任何辅助工具,一个全景自拍功能就可以轻易解决。

OPPO R9怎么使用

点击相机界面上方光圈按钮,可以设置语音拍照、延时拍照和自拍翻转等,打开手机的自拍功能后,选择“全景”拍摄,平稳移动手机就可以拍出你想要的效果了。进入设置——相机,可以设置闪拍、音量键功能、构图线、快门声音等;删除了留声拍照、超级微距、慢镜头等功能,慢速快门在专业模式里,快镜头改名延时摄影。

OPPO R9怎么使用

2、壁纸与主题

ColorOS3.0给用户提供很多漂亮的锁屏壁纸及丰富多彩的主题,用户可以点击设置,进入“壁纸有锁屏杂志”,然后选择“锁屏杂志”,接着选择相关的类型设置。

OPPO R9壁纸和主题

3、应用商店

ColorOS3.0的软件商店经过官方检测,包括常用软件应用、游戏,还针对性的拥有精选、分类、排行的检索,排行榜也看着与其他app商店有较大区别,刷榜情况不严重,最大限度的把常用APP呈现在页面上,降低查找的难度。

OPPO R9应用商店

4、手机桌面编辑

不喜欢手机桌面?又不知道怎么编辑?这个问题其实很简单,点击桌面“双指缩小”即可进入桌面编辑界面,在这里用户可以进行添加插件、设置滑屏特性等不同的编辑工作。

5、怎么调振动,无法静音怎么办?

振动调节:依次进入设置——声音与振动,用户可以设置响铃模式振动和静音模式振动。

OPPO R9手机桌面编辑

当我们音量调到最小(不能往下调的情况下),可以还是无法静音怎么办,调节音量时点击铃铛可以一键切换响铃/静音啦。

OPPO R9怎么使用

但是静音后为什么播放视频还是有声音?系统声音与媒体声音分开设置,静音模式只控制系统声音;播放音乐和视频时可以单独调节媒体音量大小。

OPPO R9怎么使用

6、自带应用设置

请点击进入“设置”,然后在“对应应用”中找到“系统设置”就可以进行相关设置了。所有自带应用的设置都集中在系统设置中,包括电话、电话本、信息、手机管家、相机、相册、音乐、语音助手、日历、备份与恢复、软件商店、游戏中心、主题商店、浏览器、购物中心。

OPPO R9怎么使用

7、想要备份手机数据找不到云盘?

在“设置”中选择“云服务”就可以打开相应的功能啦,用户可以在云盘中保留联系人、短信、照片等。如果数据丢了,云盘中没有备份,不用担心,将手机连接到电脑上,然后使用 专业的数据恢复软件互盾数据恢复软件即可轻松恢复数据。  OPPO R9怎么使用

以上内容是小编为大家带来的OPPO R9使用说明,如果你在使用同款手机不妨试试。

这篇文章介绍了简单实现android短信发送器的教程,非常实用,有需要的同学可以参考一下本文

先看看效果图:

activity_main.xml

 

 代码如下复制代码

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

  xmlns:tools="http://schemas.android.com/tools"

  android:layout_width="match_parent"

  android:layout_height="match_parent"

  android:paddingBottom="@dimen/activity_vertical_margin"

  android:paddingLeft="@dimen/activity_horizontal_margin"

  android:paddingRight="@dimen/activity_horizontal_margin"

  android:paddingTop="@dimen/activity_vertical_margin"

  tools:context="com.example.sendinfo.MainActivity">

  <TextView

    android:id="@+id/tv_input_number"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentLeft="true"

    android:layout_alignParentTop="true"

    android:text="@string/place_input_number"

    android:textSize="20px"/>

  <EditText

    android:id="@+id/et_number"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_below="@id/tv_input_number"  

    android:inputType="phone">

  

  <TextView

    android:id="@+id/tv_input_content"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_alignParentLeft="true"

    android:layout_below="@id/et_number"

    android:text="请输入正文"

    android:textSize="20px"

    android:textColor="#ff2800"/>

  <EditText

    android:lines="5"

    android:id="@+id/et_input_content"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:layout_alignParentLeft="true"

    android:layout_centerVertical="true"

    android:layout_below="@id/tv_input_content"

    android:inputType="textMultiLine"/>

  <Button

    android:id="@+id/bt_send"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentLeft="true"

    android:layout_below="@id/et_input_content"

    android:text="发送"/>

 

MainActivite.java

 

 代码如下复制代码

packagecom.example.sendinfo;

importjava.util.ArrayList;

importjava.util.Iterator;

importandroid.os.Bundle;

importandroid.support.v7.app.ActionBarActivity;

importandroid.telephony.SmsManager;

importandroid.text.TextUtils;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.Toast;

publicclassMainActivityextendsActionBarActivityimplementsOnClickListener {

  //获取数据的对象

  privateEditText et_number;

  privateEditText et_content;

  @Override

  protectedvoidonCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    et_number = (EditText) findViewById(R.id.et_number);

    et_ontent = (EditText) findViewById(R.id.et_input_content);

    Button bt_send = (Button) findViewById(R.id.bt_send);

    bt_send.setOnClickListener(this)

  }

  @Override

  publicvoidonClick(View v) {

    switch(v.getId()) {

    caR.id.bt_send:

      //获取用户输入的数据

      String content = et_content.getText().toString().trim();

      String number = et_number.getText().toString().trim();

      if(TextUtils.isEmpty(content) || TextUtils.isEmpty(number)){

        Toast.makeText(this,"电话号码或者内容不能为空", Toast.LENGTH_SHORT).show();

        return;

      }else{      

        //发送短信API   :得到一个信息管理器 实例

        SmsManager smsManager = SmsManager.getDefault();

        //短信大于70字符时,则将短信拆分成多条发送

        ArrayListcontents = smsManager.divideMessage(content);

        for(String string : contents) {

          smsManager.sendTextMessage(number,null, string,null,null);

        }               

      }     

      break;

    default:

      break;

    }

  }

}

 

小编推荐的这篇文章介绍了Android实现空心圆角矩形按钮的实例代码,有兴趣的同学可以尝试一下

页面上有时会用到背景为空心圆角矩形的Button,可以通过xml绘制出来。

drawrable文件夹下bg_red_hollow_rectangle.xml

 

 代码如下复制代码

<shape xmlns:android="http://schemas.android.com/apk/res/android"

  android:shape="rectangle">

  

  <stroke

    android:width="1dp"

    android:color="#ce1818"/>

  

 

shape:图形,rectangle为矩形;

stoke:描边
solid:填充
corners:圆角

在layout中的使用

 

 代码如下复制代码

<Button

        android:layout_width="80dp"

        android:layout_height="50dp"

        android:background="@drawable/bg_red_hollow_rectangle"

        android:gravity="center"

        android:text="分享"/>

 

效果图如下:

小编给大家分享了一篇介绍了Android选择图片或拍照图片上传到服务器的教程的文章,代码简单易懂,有需要的朋友可以动手尝试运行一下下文中代码

最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI

具体上传代码:

1.选择图片和上传界面,包括上传完成和异常的回调监听

 

 代码如下复制代码

packagecom.spring.sky.image.upload;

  

  

importjava.util.HashMap;

importjava.util.Map;

  

importandroid.app.Activity;

importandroid.app.ProgressDialog;

importandroid.content.Intent;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.os.Bundle;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.util.Log;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.ImageView;

importandroid.widget.ProgressBar;

importandroid.widget.TextView;

importandroid.widget.Toast;

  

importcom.spring.sky.image.upload.network.UploadUtil;

importcom.spring.sky.image.upload.network.UploadUtil.OnUploadProcessListener;

/**

 * @author spring sky

 * Email :vipa1888@163.com

 * QQ: 840950105

 * 说明:主要用于选择文件和上传文件操作

 */

publicclassMainActivityextendsActivityimplementsOnClickListener,OnUploadProcessListener{

 privatestaticfinalString TAG ="uploadImage";

   

 /**

  * 去上传文件

  */

 protectedstaticfinalintTO_UPLOAD_FILE =1;

 /**

  * 上传文件响应

  */

 protectedstaticfinalintUPLOAD_FILE_DONE =2;//

 /**

  * 选择文件

  */

 publicstaticfinalintTO_SELECT_PHOTO =3;

 /**

  * 上传初始化

  */

 privatestaticfinalintUPLOAD_INIT_PROCESS =4;

 /**

  * 上传中

  */

 privatestaticfinalintUPLOAD_IN_PROCESS =5;

 /***

  * 这里的这个URL是我服务器的javaEE环境URL

  */

 privatestaticString requestURL ="http://192.168.10.160:8080/fileUpload/p/file!upload";

 privateButton selectButton,uploadButton;

 privateImageView imageView;

 privateTextView uploadImageResult;

 privateProgressBar progressBar;

   

 privateString picPath =null;

 privateProgressDialog progressDialog;

   

 /** Called when the activity is first created. */

 @Override

 publicvoidonCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  initView();

 }

   

 /**

  * 初始化数据

  */

 privatevoidinitView() {

  selectButton = (Button)this.findViewById(R.id.selectImage);

  uploadButton = (Button)this.findViewById(R.id.uploadImage);

  selectButton.setOnClickListener(this);

  uploadButton.setOnClickListener(this);

  imageView = (ImageView)this.findViewById(R.id.imageView);

  uploadImageResult = (TextView) findViewById(R.id.uploadImageResult);

  progressDialog =newProgressDialog(this);

  progressBar = (ProgressBar) findViewById(R.id.progressBar1);

 }

  

 @Override

 publicvoidonClick(View v) {

  switch(v.getId()) {

  caseR.id.selectImage:

   Intent intent =newIntent(this,SelectPicActivity.class);

   startActivityForResult(intent, TO_SELECT_PHOTO);

   break;

  caseR.id.uploadImage:

   if(picPath!=null)

   {

    handler.sendEmptyMessage(TO_UPLOAD_FILE);

   }else{

    Toast.makeText(this,"上传的文件路径出错", Toast.LENGTH_LONG).show();

   }

   break;

  default:

   break;

  }

 }

  

 @Override

 protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {

  if(resultCode==Activity.RESULT_OK && requestCode == TO_SELECT_PHOTO)

  {

   picPath = data.getStringExtra(SelectPicActivity.KEY_PHOTO_PATH);

   Log.i(TAG,"最终选择的图片="+picPath);

   Bitmap bm = BitmapFactory.decodeFile(picPath);

   imageView.setImageBitmap(bm);

  }

  super.onActivityResult(requestCode, resultCode, data);

 }

   

  

 /**

  * 上传服务器响应回调

  */

 @Override

 publicvoidonUploadDone(intresponseCode, String message) {

  progressDialog.dismiss();

  Message msg = Message.obtain();

  msg.what = UPLOAD_FILE_DONE;

  msg.arg1 = responseCode;

  msg.obj = message;

  handler.sendMessage(msg);

 }

   

 privatevoidtoUploadFile()

 {

  uploadImageResult.setText("正在上传中...");

  progressDialog.setMessage("正在上传文件...");

  progressDialog.show();

  String fileKey ="pic";

  UploadUtil uploadUtil = UploadUtil.getInstance();;

  uploadUtil.setOnUploadProcessListener(this);//设置监听器监听上传状态

    

  Mapparams =newHashMap();

  params.put("orderId","11111");

  uploadUtil.uploadFile( picPath,fileKey, requestURL,params);

 }

   

 privateHandler handler =newHandler(){

  @Override

  publicvoidhandleMessage(Message msg) {

   switch(msg.what) {

   caseTO_UPLOAD_FILE:

    toUploadFile();

    break;

     

   caseUPLOAD_INIT_PROCESS:

    progressBar.setMax(msg.arg1);

    break;

   caseUPLOAD_IN_PROCESS:

    progressBar.setProgress(msg.arg1);

    break;

   caseUPLOAD_FILE_DONE:

    String result ="响应码:"+msg.arg1+"\n响应信息:"+msg.obj+"\n耗时:"+UploadUtil.getRequestTime()+"秒";

    uploadImageResult.setText(result);

    break;

   default:

    break;

   }

   super.handleMessage(msg);

  }

    

 };

  

 @Override

 publicvoidonUploadProcess(intuploadSize) {

  Message msg = Message.obtain();

  msg.what = UPLOAD_IN_PROCESS;

  msg.arg1 = uploadSize;

  handler.sendMessage(msg );

 }

  

 @Override

 publicvoidinitUpload(intfileSize) {

  Message msg = Message.obtain();

  msg.what = UPLOAD_INIT_PROCESS;

  msg.arg1 = fileSize;

  handler.sendMessage(msg );

 }

   

}

 

2.选择图片界面,主要涉及两种方式:选择图片和及时拍照图片

 

 代码如下复制代码

packagecom.spring.sky.image.upload;

  

importandroid.app.Activity;

importandroid.content.ContentValues;

importandroid.content.Intent;

importandroid.database.Cursor;

importandroid.net.Uri;

importandroid.os.Bundle;

importandroid.os.Environment;

importandroid.provider.MediaStore;

importandroid.util.Log;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.LinearLayout;

importandroid.widget.Toast;

  

/**

 * @author spring sky

 * Email :vipa1888@163.com

 * QQ: 840950105

 * @version 创建时间:2012-11-22 上午9:20:03

 * 说明:主要用于选择文件操作

 */

  

publicclassSelectPicActivityextendsActivityimplementsOnClickListener{

  

 /***

  * 使用照相机拍照获取图片

  */

 publicstaticfinalintSELECT_PIC_BY_TACK_PHOTO =1;

 /***

  * 使用相册中的图片

  */

 publicstaticfinalintSELECT_PIC_BY_PICK_PHOTO =2;

   

 /***

  * 从Intent获取图片路径的KEY

  */

 publicstaticfinalString KEY_PHOTO_PATH ="photo_path";

   

 privatestaticfinalString TAG ="SelectPicActivity";

   

 privateLinearLayout dialogLayout;

 privateButton takePhotoBtn,pickPhotoBtn,cancelBtn;

  

 /**获取到的图片路径*/

 privateString picPath;

   

 privateIntent lastIntent ;

   

 privateUri photoUri;

 @Override

 protectedvoidonCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.select_pic_layout);

  initView();

 }

 /**

  * 初始化加载View

  */

 privatevoidinitView() {

  dialogLayout = (LinearLayout) findViewById(R.id.dialog_layout);

  dialogLayout.setOnClickListener(this);

  takePhotoBtn = (Button) findViewById(R.id.btn_take_photo);

  takePhotoBtn.setOnClickListener(this);

  pickPhotoBtn = (Button) findViewById(R.id.btn_pick_photo);

  pickPhotoBtn.setOnClickListener(this);

  cancelBtn = (Button) findViewById(R.id.btn_cancel);

  cancelBtn.setOnClickListener(this);

    

  lastIntent = getIntent();

 }

  

 @Override

 publicvoidonClick(View v) {

  switch(v.getId()) {

  caseR.id.dialog_layout:

   finish();

   break;

  caseR.id.btn_take_photo:

   takePhoto();

   break;

  caseR.id.btn_pick_photo:

   pickPhoto();

   break;

  default:

   finish();

   break;

  }

 }

  

 /**

  * 拍照获取图片

  */

 privatevoidtakePhoto() {

  //执行拍照前,应该先判断SD卡是否存在

  String SDState = Environment.getExternalStorageState();

  if(SDState.equals(Environment.MEDIA_MOUNTED))

  {

     

   Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);//"android.media.action.IMAGE_CAPTURE"

   /***

    * 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的

    * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图

    * 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰

    */

   ContentValues values =newContentValues();

   photoUri =this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

   intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);

   /**-----------------*/

   startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);

  }else{

   Toast.makeText(this,"内存卡不存在", Toast.LENGTH_LONG).show();

  }

 }

  

 /***

  * 从相册中取图片

  */

 privatevoidpickPhoto() {

  Intent intent =newIntent();

  intent.setType("image/*");

  intent.setAction(Intent.ACTION_GET_CONTENT);

  startActivityForResult(intent, SELECT_PIC_BY_PICK_PHOTO);

 }

   

 @Override

 publicbooleanonTouchEvent(MotionEvent event) {

  finish();

  returnsuper.onTouchEvent(event);

 }

   

   

 @Override

 protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {

  if(resultCode == Activity.RESULT_OK)

  {

   doPhoto(requestCode,data);

  }

  super.onActivityResult(requestCode, resultCode, data);

 }

   

 /**

  * 选择图片后,获取图片的路径

  * @param requestCode

  * @param data

  */

 privatevoiddoPhoto(intrequestCode,Intent data)

 {

  if(requestCode == SELECT_PIC_BY_PICK_PHOTO )//从相册取图片,有些手机有异常情况,请注意

  {

   if(data ==null)

   {

    Toast.makeText(this,"选择图片文件出错", Toast.LENGTH_LONG).show();

    return;

   }

   photoUri = data.getData();

   if(photoUri ==null)

   {

    Toast.makeText(this,"选择图片文件出错", Toast.LENGTH_LONG).show();

    return;

   }

  }

  String[] pojo = {MediaStore.Images.Media.DATA};

  Cursor cursor = managedQuery(photoUri, pojo,null,null,null); 

  if(cursor !=null)

  {

   intcolumnIndex = cursor.getColumnIndexOrThrow(pojo[0]);

   cursor.moveToFirst();

   picPath = cursor.getString(columnIndex);

   cursor.close();

  }

  Log.i(TAG,"imagePath = "+picPath);

  if(picPath !=null&& ( picPath.endsWith(".png") || picPath.endsWith(".PNG") ||picPath.endsWith(".jpg") ||picPath.endsWith(".JPG") ))

  {

   lastIntent.putExtra(KEY_PHOTO_PATH, picPath);

   setResult(Activity.RESULT_OK, lastIntent);

   finish();

  }else{

   Toast.makeText(this,"选择图片文件不正确", Toast.LENGTH_LONG).show();

  }

 }

}

 

3. 上传工具类,主要实现了图片的上传,上传过程的初始化监听和上传完成的监听,还有上传耗时的计算

 

 代码如下复制代码

packagecom.spring.sky.image.upload.network;

  

importjava.io.DataOutputStream;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.IOException;

importjava.io.InputStream;

importjava.net.HttpURLConnection;

importjava.net.MalformedURLException;

importjava.net.URL;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.UUID;

  

importandroid.util.Log;

  

/**

 *

 * 上传工具类

 * @author spring sky

 * Email :vipa1888@163.com

 * QQ: 840950105

 * 支持上传文件和参数

 */

publicclassUploadUtil {

 privatestaticUploadUtil uploadUtil;

 privatestaticfinalString BOUNDARY = UUID.randomUUID().toString();// 边界标识 随机生成

 privatestaticfinalString PREFIX ="--";

 privatestaticfinalString LINE_END ="\r\n";

 privatestaticfinalString CONTENT_TYPE ="multipart/form-data";// 内容类型

 privateUploadUtil() {

  

 }

  

 /**

  * 单例模式获取上传工具类

  * @return

  */

 publicstaticUploadUtil getInstance() {

  if(null== uploadUtil) {

   uploadUtil =newUploadUtil();

  }

  returnuploadUtil;

 }

  

 privatestaticfinalString TAG ="UploadUtil";

 privateintreadTimeOut =10*1000;// 读取超时

 privateintconnectTimeout =10*1000;// 超时时间

 /***

  * 请求使用多长时间

  */

 privatestaticintrequestTime =0;

   

 privatestaticfinalString CHARSET ="utf-8";// 设置编码

  

 /***

  * 上传成功

  */

 publicstaticfinalintUPLOAD_SUCCESS_CODE =1;

 /**

  * 文件不存在

  */

 publicstaticfinalintUPLOAD_FILE_NOT_EXISTS_CODE =2;

 /**

  * 服务器出错

  */

 publicstaticfinalintUPLOAD_SERVER_ERROR_CODE =3;

 protectedstaticfinalintWHAT_TO_UPLOAD =1;

 protectedstaticfinalintWHAT_UPLOAD_DONE =2;

   

 /**

  * android上传文件到服务器

  *

  * @param filePath

  *   需要上传的文件的路径

  * @param fileKey

  *   在网页上xxx就是这里的fileKey

  * @param RequestURL

  *   请求的URL

  */

 publicvoiduploadFile(String filePath, String fileKey, String RequestURL,

   Mapparam) {

  if(filePath ==null) {

   sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");

   return;

  }

  try{

   File file =newFile(filePath);

   uploadFile(file, fileKey, RequestURL, param);

  }catch(Exception e) {

   sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");

   e.printStackTrace();

   return;

  }

 }

  

 /**

  * android上传文件到服务器

  *

  * @param file

  *   需要上传的文件

  * @param fileKey

  *   在网页上xxx就是这里的fileKey

  * @param RequestURL

  *   请求的URL

  */

 publicvoiduploadFile(finalFile file,finalString fileKey,

   finalString RequestURL,finalMapparam) {

  if(file ==null|| (!file.exists())) {

   sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");

   return;

  }

  

  Log.i(TAG,"请求的URL="+ RequestURL);

  Log.i(TAG,"请求的fileName="+ file.getName());

  Log.i(TAG,"请求的fileKey="+ fileKey);

  newThread(newRunnable() {//开启线程上传文件

   @Override

   publicvoidrun() {

    toUploadFile(file, fileKey, RequestURL, param);

   }

  }).start();

    

 }

  

 privatevoidtoUploadFile(File file, String fileKey, String RequestURL,

   Mapparam) {

  String result =null;

  requestTime=0;

    

  longrequestTime = System.currentTimeMillis();

  longresponseTime =0;

  

  try{

   URL url =newURL(RequestURL);

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

   conn.setReadTimeout(readTimeOut);

   conn.setConnectTimeout(connectTimeout);

   conn.setDoInput(true);// 允许输入流

   conn.setDoOutput(true);// 允许输出流

   conn.setUseCaches(false);// 不允许使用缓存

   conn.setRequestMethod("POST");// 请求方式

   conn.setRequestProperty("Charset", CHARSET);// 设置编码

   conn.setRequestProperty("connection","keep-alive");

   conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

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

//   conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

     

   /**

    * 当文件不为空,把文件包装并且上传

    */

   DataOutputStream dos =newDataOutputStream(conn.getOutputStream());

   StringBuffer sb =null;

   String params ="";

     

   /***

    * 以下是用于上传参数

    */

   if(param !=null&& param.size() >0) {

    Iteratorit = param.keySet().iterator();

    while(it.hasNext()) {

     sb =null;

     sb =newStringBuffer();

     String key = it.next();

     String value = param.get(key);

     sb.append(PREFIX).append(BOUNDARY).append(LINE_END);

     sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(LINE_END).append(LINE_END);

     sb.append(value).append(LINE_END);

     params = sb.toString();

     Log.i(TAG, key+"="+params+"##");

     dos.write(params.getBytes());

//     dos.flush();

    }

   }

     

   sb =null;

   params =null;

   sb =newStringBuffer();

   /**

    * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件

    * filename是文件的名字,包含后缀名的 比如:abc.png

    */

   sb.append(PREFIX).append(BOUNDARY).append(LINE_END);

   sb.append("Content-Disposition:form-data; name=\""+ fileKey

     +"\"; filename=\""+ file.getName() +"\""+ LINE_END);

   sb.append("Content-Type:image/pjpeg"+ LINE_END);// 这里配置的Content-type很重要的 ,用于服务器端辨别文件的类型的

   sb.append(LINE_END);

   params = sb.toString();

   sb =null;

     

   Log.i(TAG, file.getName()+"="+ params+"##");

   dos.write(params.getBytes());

   /**上传文件*/

   InputStream is =newFileInputStream(file);

   onUploadProcessListener.initUpload((int)file.length());

   byte[] bytes =newbyte[1024];

   intlen =0;

   intcurLen =0;

   while((len = is.read(bytes)) != -1) {

    curLen += len;

    dos.write(bytes,0, len);

    onUploadProcessListener.onUploadProcess(curLen);

   }

   is.close();

     

   dos.write(LINE_END.getBytes());

   byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();

   dos.write(end_data);

   dos.flush();

//  

//   dos.write(tempOutputStream.toByteArray());

   /**

    * 获取响应码 200=成功 当响应成功,获取响应的流

    */

   intres = conn.getResponseCode();

   responseTime = System.currentTimeMillis();

   this.requestTime = (int) ((responseTime-requestTime)/1000);

   Log.e(TAG,"response code:"+ res);

   if(res ==200) {

    Log.e(TAG,"request success");

    InputStream input = conn.getInputStream();

    StringBuffer sb1 =newStringBuffer();

    intss;

    while((ss = input.read()) != -1) {

     sb1.append((char) ss);

    }

    result = sb1.toString();

    Log.e(TAG,"result : "+ result);

    sendMessage(UPLOAD_SUCCESS_CODE,"上传结果:"

      + result);

    return;

   }else{

    Log.e(TAG,"request error");

    sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:code="+ res);

    return;

   }

  }catch(MalformedURLException e) {

   sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error="+ e.getMessage());

   e.printStackTrace();

   return;

  }catch(IOException e) {

   sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error="+ e.getMessage());

   e.printStackTrace();

   return;

  }

 }

  

 /**

  * 发送上传结果

  * @param responseCode

  * @param responseMessage

  */

 privatevoidsendMessage(intresponseCode,String responseMessage)

 {

  onUploadProcessListener.onUploadDone(responseCode, responseMessage);

 }

   

 /**

  * 下面是一个自定义的回调函数,用到回调上传文件是否完成

  *

  * @author shimingzheng

  *

  */

 publicstaticinterfaceOnUploadProcessListener {

  /**

   * 上传响应

   * @param responseCode

   * @param message

   */

  voidonUploadDone(intresponseCode, String message);

  /**

   * 上传中

   * @param uploadSize

   */

  voidonUploadProcess(intuploadSize);

  /**

   * 准备上传

   * @param fileSize

   */

  voidinitUpload(intfileSize);

 }

 privateOnUploadProcessListener onUploadProcessListener;

   

   

  

 publicvoidsetOnUploadProcessListener(

   OnUploadProcessListener onUploadProcessListener) {

  this.onUploadProcessListener = onUploadProcessListener;

 }

  

 publicintgetReadTimeOut() {

  returnreadTimeOut;

 }

  

 publicvoidsetReadTimeOut(intreadTimeOut) {

  this.readTimeOut = readTimeOut;

 }

  

 publicintgetConnectTimeout() {

  returnconnectTimeout;

 }

  

 publicvoidsetConnectTimeout(intconnectTimeout) {

  this.connectTimeout = connectTimeout;

 }

 /**

  * 获取上传使用的时间

  * @return

  */

 publicstaticintgetRequestTime() {

  returnrequestTime;

 }

   

 publicstaticinterfaceuploadProcessListener{

    

 }

   

   

   

   

}

 

[!--infotagslink--]

相关文章

  • photoshop打开很慢怎么办 ps打开慢的设置技巧

    photoshop软件是一款专业的图像设计软件了,但对电脑的要求也是越高越好的,如果配置一般打开ps会比较慢了,那么photoshop打开很慢怎么办呢,下面来看问题解决办法。 1、...2016-09-14
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 基于PHP给大家讲解防刷票的一些技巧

    刷票行为,一直以来都是个难题,无法从根本上防止。但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。基于 PHP,下面介绍防刷票的一些技巧:1、使用CURL进行信息伪造$ch = curl_init(); curl_setopt($ch, CURLOP...2015-11-24
  • 图解Sublime Text3使用技巧

    通过本篇文章给大家介绍Sublime Text3使用技巧的相关知识,对sublime text3技巧相关知识感兴趣的朋友一起学习吧...2015-12-24
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • oppo r9s怎么连接电脑 oppo r9s正确连接电脑方法教程

    OPPO R9s怎么打开USB调试连接电脑呢?安卓手机要连接电脑,就必须先激活开启USB调试模式,不过基于Android 6.0深度定制的ColorOS 3.0系统默认usb调试是隐藏的,初次开启需要...2016-12-21
  • OPPO R9s如何开启Real原声技术?OPPO R9s开启Real原声技术教程

    本篇文章介绍了OPPO R9s如何开启Real原声技术的方法,有需要的小伙伴可以进来看一看。 OPPO R9s如何开启Real原声技术?Real原声技术是R9s自带的音质提升技术,开启之后...2016-12-31
  • Python爬虫必备技巧详细总结

    本篇文章介绍了我在爬虫过程中总结的几个必备技巧,都是经过实验的,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下...2021-10-22
  • 分享12个非常实用的JavaScript小技巧

    这篇文章主要介绍了分享12个非常实用的JavaScript小技巧,这些小技巧可能在你的实际工作中或许能帮助你解决一些问题,需要的朋友可以参考下...2016-05-14
  • Illustrator像素级完美绘制经验技巧分享

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说像素级完美绘制的经验技巧,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看一看。 给...2016-09-14
  • PHP中print_r、var_export、var_dump用法介绍

    文章详细的介绍了关于PHP中print_r、var_export、var_dump区别比较以及这几个在php不同的应用中的用法,有需要的朋友可以参考一下 可以看出print_r跟var_export都...2016-11-25
  • Framewrok7 视图介绍(views、view)使用介绍

    下面我们来看一篇关于Framewrok7 视图介绍(views、view)使用介绍吧,希望这篇文章能够帮助到各位朋友。 一、Views 与View的介绍 1,Views (<div class="views">) (1)Vi...2016-10-02
  • 前端开发必知的15个jQuery小技巧

    本文主要介绍了前端开发必知的15个jQuery小技巧。具有很好的参考价值,下面跟着小编一起来看下吧...2017-01-26
  • Monolog PHP日志类库使用详解介绍

    PHP日志类库在低版本中我们都没有看到了但在高版本的php中就有了,下面我们来看一篇关于PHP日志类库使用详解介绍吧. Monolog遵循PSR3的接口规范,可以很轻易的替换...2016-11-25
  • php获取当前url地址的方法介绍

    这篇文章介绍了php获取当前url地址的方法小结,有兴趣的同学可以参考一下 本文实例讲述了php获取当前url地址的方法。分享给大家供大家参考,具体如下: js 获取: ...2017-01-22
  • MySQL中的binlog相关命令和恢复技巧

    操作命令:复制代码 代码如下:show binlog events in 'mysql-bin.000016' limit 10;reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件show master logs; 或者 show binary logs; 查看二进制文...2014-05-31
  • PHP-GTK 介绍及其应用

    1. PHP-GTK介绍 1.1 PHP-GTK PHP-GTK是PHP的延伸模组,它可以让程式设计师写出在客户端执行的、且独立的GUI的程式。这个模组不允许在浏览器上显视GTK+的程式,它一开始就...2016-11-25
  • MySQL编程中的6个实用技巧

    每一行命令都是用分号(;)作为结束对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如: 复制代码 代码如下: mysql_query("INSERT INTO...2015-03-15
  • PHP 获取文件目录权限函数fileperms介绍

    在php中要获取或目录权限我们可使用fileperms函数来获取,fileperms() 函数返回文件或目录的权限,。若成功,则返回文件的访问权限。若失败,则返回 false。 例子 1 ...2016-11-25