如何调用android的拍照或本地相册选取,然后再实现相片上传服务器

如何调用android的拍照或本地相册选取,然后再实现相片上传服务器,第1张

  首先是拍照:使用Intent即可,

  [java] view plaincopyprint

  01final String start = EnvironmentgetExternalStorageState();

  02private static final String PHOTOPATH = "/photo/";

  03

  04if(startequals(EnvironmentMEDIA_MOUNTED)){

  05Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

  06File file = new File(EnvironmentgetExternalStorageDirectory()+PHOTOPATH);

  07if(!fileexists()){

  08filemkdirs();

  09}

  10tempphontname = SystemcurrentTimeMillis()+"jpg";

  11bufferappend(EnvironmentgetExternalStorageDirectory()+PHOTOPATH)append(tempphontname);

  12intentputExtra(MediaStoreEXTRA_OUTPUT, UrifromFile(new File(buffertoString())));

  13startActivityForResult(intent, 1);

  14}

  final String start = EnvironmentgetExternalStorageState();

  private static final String PHOTOPATH = "/photo/";

  if(startequals(EnvironmentMEDIA_MOUNTED)){

  Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

  File file = new File(EnvironmentgetExternalStorageDirectory()+PHOTOPATH);

  if(!fileexists()){

  filemkdirs();

  }

  tempphontname = SystemcurrentTimeMillis()+"jpg";

  bufferappend(EnvironmentgetExternalStorageDirectory()+PHOTOPATH)append(tempphontname);

  intentputExtra(MediaStoreEXTRA_OUTPUT, UrifromFile(new File(buffertoString())));

  startActivityForResult(intent, 1);

  }

  

  

  其次是从本地相册选:依旧是Intent

  如下代码

  [java] view plaincopyprint

  01if(startequals(EnvironmentMEDIA_MOUNTED)){

  02 Intent getImage = new Intent(IntentACTION_GET_CONTENT);

  03 getImageaddCategory(IntentCATEGORY_OPENABLE);

  04 getImagesetType("image/jpeg");

  05 startActivityForResult(getImage, 0);

  06}

  if(startequals(EnvironmentMEDIA_MOUNTED)){

  Intent getImage = new Intent(IntentACTION_GET_CONTENT);

  getImageaddCategory(IntentCATEGORY_OPENABLE);

  getImagesetType("image/jpeg");

  startActivityForResult(getImage, 0);

  }

  接下来是主要的:因为调用完系统的方法后,回返回到回调方法onActivityResult(int, int, Intent)中,

  在里面进行主要的照片上传服务器的操作,

  见代码:

  [java] view plaincopyprint

  01@Override

  02 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  03 ContentResolver resolver = getContentResolver();

  04 if(requestCode==1)//

  05 {

  06 if(resultCode==ActivityRESULT_OK)

  07 {

  08 if(EnvironmentgetExternalStorageState()equals(EnvironmentMEDIA_MOUNTED))

  09 {

  10ew Thread(new Runnable()

  11 {

  12 @Override

  13 public void run() {

  14//进行上传操作

  15}

  16}start();

转载

先是两个layout:

1、mainxml

复制代码

复制代码

1 <xml version="10" encoding="utf-8">

2 <LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"

3 android:orientation="vertical"

4 android:layout_width="fill_parent"

5 android:layout_height="fill_parent">

6 <ListView

7 android:layout_width="fill_parent"

8 android:layout_height="fill_parent"

9 android:focusable="false"

10 android:id="@+id/lvImageList" >

11 </ListView>

12 </LinearLayout>

复制代码

复制代码

2、listitemxml

复制代码

复制代码

1 <xml version="10" encoding="utf-8">

2 <LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"

3 android:orientation="horizontal"

4 android:layout_width="fill_parent"

5 android:layout_height="android:attr/listPreferredItemHeight">

6 <ImageView

7 android:id="@+id/itemImgImageInfo"

8 android:layout_marginTop="4dip"

9 android:layout_marginBottom="4dip"

10 android:layout_width="android:attr/listPreferredItemHeight"

11 android:layout_height="android:attr/listPreferredItemHeight">

12 </ImageView>

13 <TwoLineListItem xmlns:android="http://schemasandroidcom/apk/res/android"

14 android:layout_width="fill_parent"

15 android:layout_height="fill_parent"

16 android:paddingLeft="4dip"

17 android:mode="twoLine">

18 <CheckedTextView

19 android:id="@+id/itemChkImageInfo"

20 android:layout_width="fill_parent"

21 android:layout_height="wrap_content"

22 android:gravity="center_vertical"

23 android:textAppearance="android:attr/textAppearanceSmall"

24 android:checkMark="android:attr/listChoiceIndicatorMultiple">

25 </CheckedTextView>

26 <TextView

27 android:id="@+id/itemTxtImageInfo"

28 android:layout_width="fill_parent"

29 android:layout_height="wrap_content"

30 android:gravity="center_vertical|top"

31 android:layout_marginBottom="4dip"

32 android:layout_below="@+id/itemChkImageInfo"

33 android:textAppearance="android:attr/textAppearanceSmall">

34 </TextView>

35 </TwoLineListItem>

36 </LinearLayout>

复制代码

复制代码

接着是代码:

复制代码

复制代码

1 package comandroidMultipleChoiceImageList;

2

3 import javautilArrayList;

4 import javautilHashMap;

5 import javautilList;

6 import javautilMap;

7

8 import androidappActivity;

9 import androidcontentContext;

10 import androiddatabaseCursor;

11 import androidgraphicsBitmap;

12 import androidnetUri;

13 import androidosBundle;

14 import androidproviderMediaStore;

15 import androidproviderMediaStoreImages;

16 import androidviewLayoutInflater;

17 import androidviewView;

18 import androidviewViewGroup;

19 import androidwidgetAdapterView;

20 import androidwidgetCheckedTextView;

21 import androidwidgetImageView;

22 import androidwidgetListView;

23 import androidwidgetSimpleAdapter;

24 import androidwidgetTextView;

25 import androidwidgetAdapterViewOnItemClickListener;

26

27 public class MainActivity extends Activity {

28

29 private ListView lvImageList;

30

31 private String imageID= "imageID";

32 private String imageName = "imageName";

33 private String imageInfo = "imageInfo";

34

35 private ArrayList<String> fileNames = new ArrayList<String>();

36

37 private MultipleChoiceImageListAdapter mAdapter;

38

39 / Called when the activity is first created /

40 @Override

41 public void onCreate(Bundle savedInstanceState) {

42 superonCreate(savedInstanceState);

43 setContentView(Rlayoutmain);

44

45 lvImageList=(ListView) thisfindViewById(RidlvImageList);

46 lvImageListsetItemsCanFocus(false);

47 lvImageListsetOnItemClickListener(new OnItemClickListener() {

48 @Override

49 public void onItemClick(AdapterView<> parent, View view, int position, long id) {

50

51 CheckedTextView checkedTextView = (CheckedTextView) viewfindViewById(RiditemChkImageInfo);

52 checkedTextViewtoggle();

53 mAdaptersetCheckItem(position, checkedTextViewisChecked());

54 }

55 });

56 try{

57 String[] from = {imageID, imageName, imageInfo};

58 int[] to = {RiditemImgImageInfo, RiditemChkImageInfo, RiditemTxtImageInfo};

59 mAdapter = new MultipleChoiceImageListAdapter(MainActivitythis, GetImageList(), Rlayoutlistitem, from, to);

60 lvImageListsetAdapter(mAdapter);

61 }

62 catch(Exception ex){

63 return;

64 }

65 }

66

67 //获取列表

68 private ArrayList<Map<String, String>> GetImageList(){

69

70 ArrayList<Map<String, String>> imageList = new ArrayList<Map<String,String>>();

71 HashMap<String, String> imageMap;

72

73 //读取SD卡中所有

74 Uri uri = MediaStoreImagesMediaEXTERNAL_CONTENT_URI;

75 String[] projection = { MediaStoreImagesMedia_ID, MediaStoreImagesMediaDISPLAY_NAME,MediaStoreImagesMediaDATA, MediaStoreImagesMediaSIZE};

76 String selection = MediaStoreImagesMediaMIME_TYPE + "=";

77 String[] selectionArg ={"image/jpeg"};

78 Cursor mCursor = thismanagedQuery(uri, projection, selection, selectionArg, MediaStoreImagesMediaDISPLAY_NAME);

79 imageListclear();

80 if (mCursor != null) {

81 mCursormoveToFirst();

82 while (mCursorgetPosition() != mCursorgetCount())

83 {

84 imageMap= new HashMap<String, String>();

85 imageMapput(imageID, mCursorgetString(mCursorgetColumnIndex(MediaStoreImagesMedia_ID)));

86 imageMapput(imageName, mCursorgetString(mCursorgetColumnIndex(MediaStoreImagesMediaDISPLAY_NAME)));

87 imageMapput(imageInfo, " " + (mCursorgetLong(mCursorgetColumnIndex(MediaStoreImagesMediaSIZE))/1024)+"KB");

88 imageListadd(imageMap);

89 fileNamesadd(mCursorgetString(mCursorgetColumnIndex(MediaStoreImagesMediaDATA)));

90 mCursormoveToNext();

91 }

92 mCursorclose();

93 }

94 return imageList;

95 }

96

97 //可多选列表适配器

98 class MultipleChoiceImageListAdapter extends SimpleAdapter {

99

100 private Map<Integer, Boolean> map;

101 private List<Integer> state;

102 private List< extends Map<String, >> mList;

103

104 LayoutInflater mInflater;

105

106 public MultipleChoiceImageListAdapter(Context context, List<Map<String, String>> data, int resource, String[] from, int[] to) {

107 super(context, data, resource, from, to);

108 map = new HashMap<Integer, Boolean>();

109 mInflater = LayoutInflaterfrom(context);

110 mList = data;

111 for(int i = 0; i < datasize(); i++) {

112 mapput(i, false);

113 }

114 state = new ArrayList<Integer>();

115 }

116

117 @Override

118 public int getCount() {

119 return mListsize();

120 }

121

122 @Override

123 public Object getItem(int position) {

124 return position;

125 }

126

127 @Override

128 public long getItemId(int position) {

129 return position;

130 }

131

132 //设置条目选中状态

133 public void setCheckItem(int position, Boolean isChecked){

134 mapput(position, isChecked);

135 if (statecontains(position))

136 stateremove((Object)position);

137 if (isChecked){

138 stateadd(position);

139 }

140 }

141

142 //获取列表中已选中条目

143 public long[] getCheckItemIds(){

144 int count = statesize();

145 long[] ids = new long[count];

146 for (int i = 0; i < count; i++) {

147 ids[i]= (long)stateget(i);

148 }

149 return ids;

150 }

151

152 @Override

153 public View getView(int position, View convertView, ViewGroup parent) {

154 if(convertView == null) {

155 convertView = mInflaterinflate(Rlayoutlistitem, null);

156 }

157

158 CheckedTextView checkedTextView = (CheckedTextView) convertViewfindViewById(RiditemChkImageInfo);

159 checkedTextViewsetChecked(mapget(position));

160 checkedTextViewsetText((String)mListget(position)get(imageName));

161

162 TextView textView = (TextView) convertViewfindViewById(RiditemTxtImageInfo);

163 textViewsetText((String)mListget(position)get(imageInfo));

164

165 //显示缩略图

166 ImageView image = (ImageView) convertViewfindViewById(RiditemImgImageInfo);

167 Bitmap bm = MediaStoreImagesThumbnailsgetThumbnail(getContentResolver(), LongparseLong((String)mListget(position)get(imageID)), ImagesThumbnailsMICRO_KIND, null);

168 imagesetImageBitmap(bm);

169

170 return convertView;

171 }

172 }

173 }

服务器端写个servlet,然后在doPost()方法里处理客户端上传的文件,大概代码:

DiskFileItemFactory factory = new DiskFileItemFactory();

factorysetSizeThreshold(1024 1024); // 设置最多只允许在内存中存储的数据, 单位:字节

factorysetRepository(cachepath); // 设置一旦文件大小超过设定值时数据存放的目录

ServletFileUpload srvFileUpload = new ServletFileUpload(factory);

srvFileUploadsetSizeMax(1024 1024 1024); // 设置允许用户上传文件大小, 单位:字节

// 开始读取上传信息

List fileItems = null;

try {

fileItems = srvFileUploadparseRequest(request);

} catch (Exception e) {

Systemoutprintln("获取上传信息。。。。。。失败");

}

// 依次处理每个上传的文件

Iterator iter = fileItemsiterator();

while (iterhasNext()) {

FileItem item = (FileItem) iternext(); // 忽略其他不是文件域的所有表单信息

if (!itemisFormField()) {

// 取出文件域的所有表单信息

} else {

// 取出不是文件域的所有表单信息

}

}

ctet-stream代表的是文件的形式传输的,这样做的好处是可以传输多种格式的文件,不管你是jpeg还是png都可以通过这种方式传送过去

octet-stream代表的是文件的形式传输的,这样做的好处是可以传输多种格式的文件,不管你是jpeg还是png都可以通过这种方式传送过去

你建立HttpUrlConntion的时候没有指定Content-Type头域吧

文件上传需要用到HttpClient,打开系统相册需要通过内容提供者调用android相册或者文件管理器(源代码查看附件)关于HttpClient的文件上传HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

一、HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

二、特性

1 基于标准、纯净的java语言。实现了Http10和Http11

2 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3 支持HTTPS协议。

4 通过Http代理建立透明的连接。

5 利用CONNECT方法通过Http代理建立隧道的https连接。

6 Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7 插件式的自定义认证方案。

8 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10 自动处理Set-Cookie中的Cookie。

11 插件式的自定义Cookie策略。

12 Request的输出流可以避免流中内容直接缓冲到socket服务器。

13 Response的输入流可以有效的从socket服务器直接读取相应内容。

14 在http10和http11中利用KeepAlive保持持久连接。

15 直接获取服务器发送的response code和 headers。

16 设置连接超时的能力。

17 实验性的支持http11 response caching。

18 源代码基于Apache License 可免费获取。

三、使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1 创建HttpClient对象。

2 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6 释放连接。无论执行方法是否成功,都必须释放连接

  利用ftp定时上传log到其他服务器的方法

  利用ftp定时上传log到其他服务器 #!/bin/bash #时间的生成 Y=` date --date="-1 hour" +%Y` m=` date --date="-1 hour" +%m` d=`date --date="-1 hour" +%d` H=`date --date="-1 hour" +%H`

  IPhone上传到服务器

  求助:IPhone上传到服务器 我在网上看到 IPhone上传到服务器用的是PHP的web接收,地址: 我只会aspnet ,请问用ASPnet和IPhone怎么结合实现手机端的上传到服务器上 求助!!! 重点在:if (move_uploaded_file($_FILES['u

  android开发以上传到七牛云存储服务器

  android开发之上传到七牛云存储服务器 相信很多开发者会把存放到七牛上,我的web站点也是吧存储到七牛上,对于以为主的站点,这样可以节省很大带宽。 将上传到七牛服务器的重点就是获得上传凭证uploadToken,直接把AccessKey和Secret放到客户端太不安全,容易被反编译。所以需要在服务器端根据AccessKey和Secret动态生成一个uploadToken,

1在管理控制台找到OOS并开通

2点击存储空间,创建bucket

1、 Android SDK开发包

Android Studio方式(推荐) Maven依赖

2、权限设置

在 AndroidManifestxml 文件中已经配置了这些权限,否则,SDK 将无法正常工作。

3混淆设置

修改 项目名\app[proguard-rulespro ]路径下的proguard-rulespro文件

4写工具类

(1)首先要有4个数据

END_POINT 、BUCKET_NAME 、Access Key ID、Access Key Secret

创建你的Access Key 然后将需要的值复制粘贴到工具类对应位置

(2)写工具类,UploadHelper

(按钮点击上传一张,因为测试,我就把路径写死了)

1、写一个leyout

2对应的Java类

3、结果验证

看到如上结果,那恭喜你大功告成了。

[ps]有的人可能有个地方会报错,当然不能原原本本的抄了

这里要换成你自己的全局Application Content,

另外,一个HashUtiljava

本文链接: https://blogcsdnnet/qq_37971615/article/details/81975465

  最近看了几篇关于Android照相机的一些文章,现在总结如下,直接上源代码把,该说的都用注释说完了

  1java代码

  package organdroidtest;

  import javaioFile;

  import androidappActivity;

  import androidcontentIntent;

  import androidgraphicsBitmap;

  import androidgraphicsBitmapFactory;

  import androidnetUri;

  import androidosBundle;

  import androidosEnvironment;

  import androidproviderMediaStore;

  import androidviewView;

  import androidviewViewOnClickListener;

  import androidwidgetButton;

  import androidwidgetImageView;

  import androidwidgetToast;

  public class Android_mytestActivity extends Activity {

  / Called when the activity is first created /

  // 定义一个button打开照相机,定义一个imageview显示照相机所拍摄的相片;

  Button but,upload_image;

  ImageView img;

  // 获取sd卡根目录地址,并创建父目录文件对象和文件的对象;

  String file_str = EnvironmentgetExternalStorageDirectory()getPath();

  File mars_file = new File(file_str + "/my_camera");

  File file_go = new File(file_str + "/my_camera/filejpg");

  @Override

  public void onCreate(Bundle savedInstanceState) {

  superonCreate(savedInstanceState);

  setContentView(Rlayoutmain);

  but = (Button) findViewById(Ridmy_camare_button);

  upload_image=(Button)findViewById(Ridupload_image);

  img = (ImageView) findViewById(Ridmy_img_view);

  //拍照

  butsetOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  // TODO Auto-generated method stub

  // 验证sd卡是否正确安装:

  if (EnvironmentMEDIA_MOUNTEDequals(Environment

  getExternalStorageState())) {

  // 先创建父目录,如果新创建一个文件的时候,父目录没有存在,那么必须先创建父目录,再新建文件。

  if (!mars_fileexists()) {

  mars_filemkdirs();

  }

  

  ///常规情况下,我们这里会 创建子目录,但在这里不用系统拍照完毕后会根据所给的路径自动去实现;

  if(!file_goexists())

  {

  try {

  file_gocreateNewFile();

  } catch (IOException e) {

  }}

  /

  // 设置跳转的系统拍照的activity为:MediaStoreACTION_IMAGE_CAPTURE ;

  Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

  // 并设置拍照的存在方式为外部存储和存储的路径;

  intentputExtra(MediaStoreEXTRA_OUTPUT,

  UrifromFile(file_go));

  //跳转到拍照界面;

  startActivityForResult(intent, 0x1);

  } else {

  ToastmakeText(Android_mytestActivitythis, "请先安装好sd卡",

  ToastLENGTH_LONG)show();

  }

  }

  });

  //上传

  upload_imagesetOnClickListener(new OnClickListener() {

  

  @Override

  public void onClick(View v) {

  // TODO Auto-generated method stub

  if(file_goexists())

  {

  //验证存在后就实现,上传功能,得到与服务器的输出流

  //什么URLconnection ,HttpURLconnectio等都可以

  ToastmakeText(Android_mytestActivitythis, "上传中",

  ToastLENGTH_LONG)show();

  }

  else

  {

  ToastmakeText(Android_mytestActivitythis, "请先拍照",

  ToastLENGTH_LONG)show();

  }

  }

  });

  

  }

  //拍照结束后显示;

  @Override

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  // TODO Auto-generated method stub

  // 判断请求码和结果码是否正确,如果正确的话就在activity上显示刚刚所拍照的;

  if (requestCode == 0x1 && resultCode == thisRESULT_OK) {

  / 使用BitmapFactoryOptions类防止OOM(Out Of Memory)的问题;

  创建一个BitmapFactoryOptions类用来处理bitmap;/

  BitmapFactoryOptions myoptions=new BitmapFactoryOptions();

  / 设置Options对象inJustDecodeBounds的属性为true,用于在BitmapFactory的

  decodeFile(String path, Options opt)后获取的高和宽;

  而且设置了他的属性值为true后使用BitmapFactory的decodeFile()方法无法返回一张

  的bitmap对象,仅仅是把的高和宽信息给Options对象;

  /

  myoptionsinJustDecodeBounds=true;

  BitmapFactorydecodeFile(file_gogetAbsolutePath(),myoptions);

  //根据在的宽和高,得到在不变形的情况指定大小下的缩略图,设置宽为222;

  int height=myoptionsoutHeight222/myoptionsoutWidth;

  myoptionsoutWidth=222;

  myoptionsoutHeight=height;

  //在重新设置玩显示的高和宽后记住要修改,Options对象inJustDecodeBounds的属性为false;

  //不然无法显示;

  myoptionsinJustDecodeBounds=false;

  //还没完这里才刚开始,要节约内存还需要几个属性,下面是最关键的一个;

  myoptionsinSampleSize=myoptionsoutWidth/222;

  //还可以设置其他几个属性用于缩小内存;

  myoptionsinPurgeable=true;

  myoptionsinInputShareable=true;

  myoptionsinPreferredConfig=BitmapConfigARGB_4444;// 默认是BitmapConfigARGB_8888

  //成功了,下面就显示咯;

  Bitmap bitmat = BitmapFactorydecodeFile(file_gogetAbsolutePath(),myoptions);

  imgsetImageBitmap(bitmat);

  } else {

  Systemoutprintln("不显示");

  }

  superonActivityResult(requestCode, resultCode, data);

  }

  }

转载

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何调用android的拍照或本地相册选取,然后再实现相片上传服务器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情