如何调用android的拍照或本地相册选取,然后再实现相片上传服务器
首先是拍照:使用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);
}
}
转载
0条评论