GVKun编程网logo

Android Oss上传图片的使用示例(android图片上传实现)

7

想了解AndroidOss上传图片的使用示例的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于android图片上传实现的相关问题,此外,我们还将为您介绍关于.net接收ios,android

想了解Android Oss上传图片的使用示例的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于android图片上传实现的相关问题,此外,我们还将为您介绍关于.net 接收ios, android的上传图片、android addressbook.proto 使用示例、Android AIDL 远程服务使用示例、Android App中使用Pull解析XML格式数据的使用示例的新知识。

本文目录一览:

Android Oss上传图片的使用示例(android图片上传实现)

Android Oss上传图片的使用示例(android图片上传实现)

前言

前一阵项目中的上传图片改为上传到阿里上,记录一下实现的过程,方便以后查看。

参考资料:官方文档

配置

Android studio添加依赖

dependencies {
  compile 'com.aliyun.dpa:oss-android-sdk:2.4.5'
  compile 'com.squareup.okhttp3:okhttp:3.4.1'
  compile 'com.squareup.okio:okio:1.9.0'
}

直接引入jar包(对Android studio 或者 Eclipse 都适用)

1.在官网下载 sdk 包
2.解压后得到 jar 包,目前包括 aliyun-oss-sdk-android-x.x.x.jar、okhttp-3.x.x.jar 和 okio-1.x.x.jar
3.将以上 3 个 jar 包导入 libs 目录

权限设置

确保AndroidManifest.xml 文件中已经配置了这些权限,否则,SDK 将无法正常工作。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

混淆设置

-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**

实现过程

首先为了安全起见,采用的是STS鉴权模式,则要用到的数据都是从后台获得然后应用到前台的。

1.创建OSSClient (自己在这里命名为OssService)

OSSClient为OSS 服务的 Android 客户端,它为调用者提供了一系列的方法,可以用来操作,管理存储空间(bucket)和文件(object)等。

public class OssService {
  private OSS oss;
  private String bucket;
  private picResultCallback callback;//回调接口
  private String path=地址(后台告诉);
  public OssService(OSS oss,String bucket,picResultCallback callback) {
    this.oss = oss;
    this.bucket = bucket;
    this.callback=callback;
  }
 
 /**object字段为图片的上传地址(具体地址的前缀后端给,这个是拼起
  *来的一个路径)
  *localFile图片的本地地址
  *mProgress 进度条
  *img 显示图片的控件
  *type 类型
 */
  public void asyncputimage(String object,final String localFile,final ProgressBar mProgress,final ImageView img,String type) {
    if (object.equals("")) {
      Log.w("Asyncputimage","ObjectNull");
      return;
    }
    File file = new File(localFile);
    if (!file.exists()) {
      Log.w("Asyncputimage","FileNotExist");
      Log.w("LocalFile",localFile);
      return;
    }
    // 构造上传请求
    PutObjectRequest put = new PutObjectRequest(bucket,object,localFile);
      put.setCallbackParam(new HashMap<String,String>() {
        {
          put("callbackUrl",path);
          put("callbackBody","filename=${object}&size=${size}&id=${x:id}&action=${x:action}");
//https://help.aliyun.com/document_detail/31989.html?spm=5176.doc31984.6.883.brskVg
        }
      });
    HashMap<String,String> hashMap=new HashMap<>();
    hashMap.put("x:id",id);
    hashMap.put("x:action",type);
    put.setCallbackVars(hashMap);
    // 异步上传时可以设置进度回调
    put.setProgressCallback(new OssprogressCallback<PutObjectRequest>() {
      @Override
      public void onProgress(PutObjectRequest request,long currentSize,long totalSize) {
        int progress = (int) (100 * currentSize / totalSize);
        mProgress.setProgress(progress);
      }
    });
    OSSAsyncTask task = oss.asyncputObject(put,new OSSCompletedCallback<PutObjectRequest,PutObjectResult>() {
      @Override
      public void onSuccess(PutObjectRequest request,final PutObjectResult result) {
       Observable.just(result).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<PutObjectResult>() {
          @Override
          public void call(PutObjectResult putObjectResult) {
            mProgress.setVisibility(View.GONE);
            img.setColorFilter(null);
            callback.getPicData(result,localFile);
          }
        });
      }
      @Override
      public void onFailure(PutObjectRequest request,ClientException clientExcepion,ServiceException serviceException) {
        String info = "";
        // 请求异常
        if (clientExcepion != null) {
          // 本地异常如网络异常等
          clientExcepion.printstacktrace();
          info = clientExcepion.toString();
        }
        if (serviceException != null) {
          // 服务异常
          Log.e("ErrorCode",serviceException.getErrorCode());
          Log.e("RequestId",serviceException.getRequestId());
          Log.e("HostId",serviceException.getHostId());
          Log.e("RawMessage",serviceException.getRawMessage());
          info = serviceException.toString();
        }
      }
    });
  }
//成功的回调接口
  public interface picResultCallback {
    void getPicData(PutObjectResult data,String oldpath);
  }
}

2.实现OssService的方法(在activity中)

public OssService initOSS(String endpoint,String bucket) {
  OSSCredentialProvider credentialProvider;
  credentialProvider = new STSGetter(tokenBean);
  //设置网络参数
  ClientConfiguration conf = new ClientConfiguration();
  conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
  conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
  conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
  conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
  OSS oss = new OSSClient(getApplicationContext(),endpoint,credentialProvider,conf);
  return new OssService(oss,bucket,this);
}

3.重载OSSFederationCredentialProvider生成自己的获取STS的功能(一般自动获得token写在这里,在getFederationToken()方法中,告诉它你获得token的规则即可)

1>官方demo代码(自动更新token)

public class OSSAuthCredentialsProvider extends OSSFederationCredentialProvider {
  private String mAuthServerUrl;
  private AuthDecoder mDecoder;
  public OSSAuthCredentialsProvider(String authServerUrl) {
    this.mAuthServerUrl = authServerUrl;
  }

  /**
   * set auth server url
   * @param authServerUrl
   */
  public void setAuthServerUrl(String authServerUrl) {
    this.mAuthServerUrl = authServerUrl;
  }

  /**
   * set response data decoder
   * @param decoder
   */
  public void setDecoder(AuthDecoder decoder) {
    this.mDecoder = decoder;
  }

  @Override
  public OSSFederationToken getFederationToken() throws ClientException {
    OSSFederationToken authToken;
    String authData;
    try {
      URL stsUrl = new URL(mAuthServerUrl);
      HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
      conn.setConnectTimeout(10000);
      InputStream input = conn.getInputStream();
      authData = IoUtils.readStreamAsstring(input,OSSConstants.DEFAULT_CHARSET_NAME);
      if (mDecoder != null) {
        authData = mDecoder.decode(authData);
      }
      JSONObject jsonObj = new JSONObject(authData);
      int statusCode = jsonObj.getInt("StatusCode");
      if (statusCode == 200) {
        String ak = jsonObj.getString("AccessKeyId");
        String sk = jsonObj.getString("AccessKeySecret");
        String token = jsonObj.getString("SecurityToken");
        String expiration = jsonObj.getString("Expiration");
        authToken = new OSSFederationToken(ak,sk,token,expiration);
      } else {
        String errorCode = jsonObj.getString("ErrorCode");
        String errorMessage = jsonObj.getString("ErrorMessage");
        throw new ClientException("ErrorCode: " + errorCode + "| ErrorMessage: " + errorMessage);
      }
      return authToken;
    } catch (Exception e) {
      throw new ClientException(e);
    }
  }

  public interface AuthDecoder {
    String decode(String data);
  }
}

2>自己的代码(因为自己的所有数据都是从后台获得的,而且结合rxjava没有想到可以返回数据的方式,所以采用手动更新token的方式)

手动更新token的具体操作:

首先token的值存在MyApp中,第一次在进入需要用到token界面时候,先获得token的值更新MyApp中的值并记录当下的时间,如果下次再次进入任何一个需要用到token的界面的时候,则判断时间是否过期,过期则重新请求token更新token的值。

public class STSGetter extends OSSFederationCredentialProvider {
  private OSSFederationToken ossFederationToken;
  String ak;
  String sk;
  String token ;
  String expiration ;
  public STSGetter(TokenBean bean) {
    this.ak = bean.getCredentials().getAccessKeyId();
    this.sk = bean.getCredentials().getAccessKeySecret();
    this.token = bean.getCredentials().getSecurityToken();
    this.expiration = bean.getCredentials().getExpiration();
  }
  public OSSFederationToken getFederationToken() {
  return new OSSFederationToken(ak,expiration);
  }
}

4.实例化OSSClient,调用上传图片方法

//实例化OSSClient (自己是在onCreate()中实例化的,当然考虑到token的过期问题,也有在onResume()中再次实例化一次)
ossService = initOSS(tokenBean.getBucket().getEndPoint(),tokenBean.getBucket().getBucketName());
//上传图片,需要根据自己的逻辑传参数
ossService.asyncputimage(图片在阿里上的存储路径,本地路径,...);

5.回调处理图片逻辑

/**
 * 对图片上传回来的数据进行处理
 * @param data
 */
  @Override
  public void getPicData(PutObjectResult data,String oldpath) {
    Gson gson = new Gson();
    OssuploadImage uploadImage = gson.fromJson(data.getServerCallbackReturnBody(),OssuploadImage.class);
          ........逻辑自己写吧
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • android文件上传示例分享(android图片上传)
  • Android使用post方式上传图片到服务器的方法
  • Android实现本地上传图片并设置为圆形头像
  • Android Retrofit 2.0框架上传图片解决方案
  • Android中Okhttp3实现上传多张图片同时传递参数
  • android上传图片到PHP的过程详解
  • Android图片压缩上传之基础篇
  • Android图片上传实现预览效果
  • Android 开发 使用WebUploader解决安卓微信浏览器上传图片中遇到的bug

.net 接收ios, android的上传图片

.net 接收ios, android的上传图片

总的来说ios上传的是二进制, android上传的base64, 当然可以处理, 但是人家都很懒, 没办法, 刚来嘛, 只能我这边改啦

 

ios接收

/// <summary>
/// ios图片上传 
/// </summary> 
/// <returns>成功上传返回上传后的文件名</returns>
[HttpPost]
public IHttpActionResult UpLoadImage()
{
    var resultMsg = new ResultMsg
    {
        statue = Convert.ToInt32(StatueEnum.Fail)
    };
    try
    {
        var files = HttpContext.Current.Request.Files;
        if (files.AllKeys.Any())
        {
            foreach (string key in files.AllKeys)
            {
                HttpPostedFile file = files[key];
                if (file != null && string.IsNullOrEmpty(file.FileName) == false)
                {
                    var virthfolder = ConfigHelper.Instance.GetAppConfig("ServerImgaes");
                    var path = HttpContext.Current.Server.MapPath($"~/{virthfolder}");
                    var name = path + file.FileName;
                    file.SaveAs(name);

                    var fileInfo = new FileInfo(name);
                    var ext = Path.GetExtension(file.FileName);
                    var newfileName = Guid.NewGuid() + ext;
                    var newName = path + "/" + newfileName;
                    fileInfo.MoveTo(newName);

                    resultMsg.statue = Convert.ToInt32(StatueEnum.Success);
                    resultMsg.msg = International.UploadedSuccessfully;
                    resultMsg.data = new
                    {
                        fileName = newfileName,
                        url = Request.RequestUri.Authority + virthfolder, //可配, 
                    };
                }
            }
        }
        else
        {
            resultMsg.msg = International.UploadEmpty;
        }
    }
    catch (Exception exception)
    {
        resultMsg.statue = Convert.ToInt32(StatueEnum.Error);
        resultMsg.msg = International.InternalRequestError;
    }
    return Ok(resultMsg);
}

 

 

 

android

/// <summary>
/// Android图片上传 
/// </summary> 
/// <returns>成功上传返回上传后的文件名</returns>
[HttpPost]
public IHttpActionResult AndroidUpLoadImage()
{
    var resultMsg = new ResultMsg
    {
        statue = Convert.ToInt32(StatueEnum.Fail)
    };
    try
    {
        var files = HttpContext.Current.Request.Form;
        if (files.Count > 0)
        {
            var base64Code = files["Filedata"];
            var virthfolder = ConfigHelper.Instance.GetAppConfig("ServerImgaes"); //可配
            var path = HttpContext.Current.Server.MapPath($"~/{virthfolder}"); //保存路径 

            string ext = string.Empty;
            if (base64Code.Contains("data:image/jpeg;base64,"))
            {
                ext = ".jpeg";
                base64Code = base64Code.Substring(23);
            }
            else if (base64Code.Contains("data:image/png;base64,"))
            {
                ext = ".png";
                base64Code = base64Code.Substring(22);
            }
            else if (base64Code.Contains("data:image/jpg;base64,"))
            {
                ext = ".jpg";
                base64Code = base64Code.Substring(22);
            }
            var bytes = Convert.FromBase64String(base64Code);
            var ms = new MemoryStream(bytes);
            var newfilename = Guid.NewGuid() + ext;
            new Bitmap(ms).Save(path + "/" + newfilename);
            resultMsg.statue = Convert.ToInt32(StatueEnum.Success);
            resultMsg.msg = International.UploadedSuccessfully;
            resultMsg.data = new
            {
                filename = newfilename,
                url = Request.RequestUri.Authority + virthfolder, //可配, 
            };
        }
        else
        {
            resultMsg.msg = International.UploadEmpty;
        }
    }
    catch (Exception exception)
    {
        resultMsg.statue = Convert.ToInt32(StatueEnum.Error);
        resultMsg.msg = International.InternalRequestError;
    }
    return Ok(resultMsg);
}

 

android addressbook.proto 使用示例

android addressbook.proto 使用示例

转,参见链接

Android AIDL 远程服务使用示例

Android AIDL 远程服务使用示例

Android AIDL 远程服务使用示例

了解 Android 上比较强大的远程服务设计。

一、为什么要使用 AIDL,他的优势有哪些呢 ?

AIDL 服务更像是 一个 Server,可以为多个应用提供服务。由于使用了 IDL 这样类似 COM 组件或者说中间语言的设计,可以让后续的开发者无需了解内部,根据暴漏的接口实现相关的操作,AIDL 可以工作在独立的进程中。

二、学习 AIDL 服务需要有哪些前置知识 ?

作为 Android 上服务的扩展,首先你要了解 Android Service 模型,Android Serivice 我们可以分为两种模式,三个类型,1. 最简单的 Service 就是无需处理 onBind 方法,一般使用广播通讯,效率比较低。2. 使用 Binder 模式处理 Service 和其他组件比如 Activity 通讯,Android 开发网提示对于了解了 Binder 模式的服务后,开发 AIDL 远程服务就轻松容易的多。

三、具体实例,我们以 com.android123.cwj.demo 为工程名,首先在工程目录的 com.android123.cwj 目录下创建一个 ICWJ.aidl 文件,内容为

C/C++ 代码 

1 packagecom.android123.cwj;

2 interfaceICWJ{

3 StringgetName();


如果格式 AIDL 格式没有问题,在 Eclipse ADT 插件会在工程的 gen 目录下会自动生成一个 Java 实现文件。

Service 中代码如下:

C/C++ 代码 

5 publicclassCWJServiceextendsService{

7 publicstaticfinalStringBIND="com.android123.cwj.CWJService.BIND";

8 publicStringmName="android123";

9 privatefinalICWJ.StubmBinder=newICWJ.Stub()

10 {

11 @Override

12 publicStringgetName()throwsRemoteException

13 {// 重写在 AIDL 接口中定义的 getName 方法,返回一个值为我们的成员变量 mName 的内容。

14 try

15 {

16 returnCWJService.this.mName;

17 }

18 catch(Exceptione)

19 {

20 returnnull;

21 }

22 }

23 ;

24 

25 @Override

26 publicvoidonCreate(){

27 Log.i("svc","created.");

28 }

29 @Override

30 publicIBinderonBind(Intentintent){

31 returnmBinder;// 这里我们要返回 mBinder 而不是一般 Service 中的 null

32 }

33 }


接着在 AndroidManifest.xml 文件中定义

C/C++ 代码 

34 <serviceandroid:name=".CWJService">

35 <intent-filter>

36 <actionandroid:name="com.android123.cwj.CWJService.BIND"/>

37 <categoryandroid:name="android.intent.category.DEFAULT"/>

38 </intent-filter>

39 </service>


接下来在 Activity 中的调用,我们可以

C/C++ 代码 

40 privateICWJobjCWJ=null;

41 privateServiceConnectionserviceConn=newServiceConnection(){

42 @Override

43 publicvoidonServiceDisconnected(ComponentNamename){

44 }

45 @Override

46 publicvoidonServiceConnected(ComponentNamename,IBinderservice){

47 objCWJ=ICWJ.Stub.asInterface(service);

48 }

49 ;


Activity onCreate 中加入绑定服务的代码

C/C++ 代码 

50 Intentintent=newIntent();

51 intent.setClass(this,CWJService.class);

52 bindService(intent,serviceConn,Context.BIND_AUTO_CREATE);


同时重写 Activity onDestory 方法

C/C++ 代码 

53 @Override

54 publicvoidonDestroy(){

55 unbindService(serviceConn);// 取消绑定

56 super.onDestroy();

57 }


执行 AIDL getName 可以通过下面的方法

C/C++ 代码 

58 if(objCWJ==null)

59 {

60 try{

61 StringstrName=obj.getName();

62 }

63 catch(RemoteExceptione)

64 {}

65 }

安卓学习地址:http://www.microoh.com/course/

移动开发交流群:164427941


Android App中使用Pull解析XML格式数据的使用示例

Android App中使用Pull解析XML格式数据的使用示例

 Pull解析XML文件的方式与SAX解析XML文件的方式大致相同,他们都是基于事件驱动的。所以,利用pull解析XML文件需要下面几个步骤:

     1)通过XMLPullParserFactory获取XMLPullParser对象。

     2)通过XMLPullParser对象设置输入流。

     3)通过parser.next(),持续的解析XML文件直到文件的尾部。

下面的几个方法是经常需要的:XMLPullParserFacotry.newInstance( )    facotry.newPullParser( )   parser.setInput( )       parser.next( ).

下面通过一个例子描述上面的几个步骤:

//1.第一步,创建解析工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//设置支持命名空间
factory.setNamespaceAware(true);
//2.生成parser对象     
XmlPullParser parser = factory.newPullParser();
//3.设置输入
parser.setInput(new StringReader("<?xml version=\"1.0\" ?><poem><title>静夜思</title><author>李白</author><content>床前明月光,疑似地上霜,举头忘明月,低头思故乡</content></poem>"));
//获取输入类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
 {
   if (eventType == XmlPullParser.START_DOCUMENT) {
  Log.d("tag","----"+parser.getName());
  }
   if (eventType == XmlPullParser.START_TAG) {
  Log.d("tag","----"+parser.getName());
  }
   if (eventType == XmlPullParser.TEXT) {
  Log.d("tag","----"+parser.getText());
  }
   if (eventType == XmlPullParser.END_TAG) {
  Log.d("tag","----"+parser.getName());
  }
  //不断的去更新
  eventType = parser.next();
 }

打印出的对象:

2016415151330157.png (640×238)

pull在android 集成了这种解析,性能和sax差不多,个人认为用来来比sax解析容易多了;采用事件驱动进行解析。
dom(Document Object Model)文档对象模型:是W3C组织推荐的解析XML的一种方式;一般只能只能解析比较小的XML文件;因为dom解析是把整个XML放入内存,占用内存比较大,但对文档的
增删改查标胶容易操作。
sax(Simple API for XML)不是官方的标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。sax解析一般适合xml的读取,sax解析是从上往下读取,一行一行来读。

来看一个完整的实例:

package com.android.xiong.documentpullxml; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.LinkedHashMap; 
 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 
 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class MainActivity extends Activity { 
 
  TextView showtxt; 
  Button btshow; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    showtxt = (TextView) findViewById(R.id.showtxt); 
    btshow = (Button) findViewById(R.id.showxml); 
    btshow.setonClickListener(new OnClickListener() { 
       
      @Override 
      public void onClick(View v) { 
        GetBaiduXmlBooks baiduxml=new GetBaiduXmlBooks(); 
        baiduxml.execute("http://bcs.duapp.com/meinvlook/books.xml"); 
      } 
    }); 
  } 
 
  // 异步任务 
  class GetBaiduXmlBooks extends 
      AsyncTask<String,Integer,LinkedHashMap<String,String>> { 
 
    ProgressDialog progress; 
 
    // 初始化ProgressDialog 
    @Override 
    protected void onPreExecute() { 
      progress = new ProgressDialog(MainActivity.this); 
      progress.setTitle("提示!"); 
      progress.setMessage("正在解析百度云存储的XML"); 
      progress.setCanceledOnTouchOutside(false); 
      progress.setButton(ProgressDialog.BUTTON_NEUTRAL,"取消",new DialogInterface.OnClickListener() { 
 
            @Override 
            public void onClick(DialogInterface dialog,int which) { 
              // 取消任务 
              GetBaiduXmlBooks.this.cancel(true); 
              progress.dismiss(); 
            } 
          }); 
      progress.show(); 
    } 
 
    // 进行耗时操作 
    @Override 
    protected LinkedHashMap<String,String> doInBackground(String... params) { 
      String xmurl = params[0]; 
      LinkedHashMap<String,String> map = new LinkedHashMap<String,String>(); 
      URL url; 
      try { 
        url = new URL(xmurl); 
        HttpURLConnection connection = (HttpURLConnection) url 
            .openConnection(); 
        connection.setConnectTimeout(10000); 
        connection.setRequestMethod("GET"); 
        InputStream instream = connection.getInputStream(); 
        // 获取xml解析器 
        XmlPullParser parser = XmlPullParserFactory.newInstance() 
            .newPullParser(); 
        parser.setInput(instream,"UTF-8"); 
        int type=parser.getEventType(); 
        //开始解析xml文件 
        while (type!= XmlPullParser.END_DOCUMENT) { 
          if (type == XmlPullParser.START_TAG) { 
            // 获取开始标签 
            if (parser.getName().equals("书名")) { 
              //获取节点的值 
              map.put("书名",parser.nextText()); 
            } 
            if (parser.getName().equals("价格")) { 
              map.put("价格",parser.nextText()); 
            } 
            if (parser.getName().equals("作者")) { 
              map.put("作者",parser.nextText()); 
            } 
            if (parser.getName().equals("性别")) { 
              map.put("性别",parser.nextText()); 
            } 
            if (parser.getName().equals("年龄")) { 
              map.put("年龄",parser.nextText()); 
            } 
          } 
          type=parser.next(); 
        } 
      } catch (IOException e) { 
        e.printstacktrace(); 
      } catch (XmlPullParserException e) { 
        e.printstacktrace(); 
      } 
      return map; 
    } 
 
    @Override 
    protected void onPostExecute(LinkedHashMap<String,String> result) { 
 
      for (String txt : result.keySet()) { 
        showtxt.append(txt+":"+result.get(txt)+"\n"); 
      } 
      progress.dismiss(); 
       
    } 
 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main,menu); 
    return true; 
  } 
 
} 
<LinearLayout xmlns: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:orientation="vertical" 
  tools:context=".MainActivity" > 
   
  <Button  
    android:id="@+id/showxml" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/btshowxml"/> 
 
  <TextView 
    android:id="@+id/showtxt" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
 
</LinearLayout> 

<!-- 获取网络权限 --> 
<uses-permission android:name="android.permission.INTERNET"/> 

关于Android Oss上传图片的使用示例android图片上传实现的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.net 接收ios, android的上传图片、android addressbook.proto 使用示例、Android AIDL 远程服务使用示例、Android App中使用Pull解析XML格式数据的使用示例的相关信息,请在本站寻找。

本文标签: