效果:
注意:
1:网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2:我封装了一个OKHttp,需要在build.gradle 中加入
compile 'com.squareup.okhttp3:logging-interceptor:3.4.2' 在同步一在
3:用SharedPreferences 保存和获取图片了,将图片和字符串进行了转换
4: 可以调用相机和相册获取图片,并进行剪切 //-----------------我的布局文件----------------------------- <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context="tckpicture.bwie.com.tackpicture2.MainActivity"> <ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
android:src="@mipmap/ic_launcher"
android:id="@+id/iv_img"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相机"
android:id="@+id/bt_camera"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相册"
android:id="@+id/bt_xiangce"/>
</LinearLayout> //-------------我的MainActivity ------------------------- package tckpicture.bwie.com.tackpicture2; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import okhttp3.Request; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView iv_img;
private Button bt_camera;
private Button bt_xiangce;
private static final int PHOTO_REQUEST_CAREMA = ;// 拍照
private static final int PHOTO_REQUEST_GALLERY = ;// 从相册中选择
private static final int PHOTO_REQUEST_CUT = ;// 结果
/* 头像名称 */
private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
private File tempFile; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
iv_img = (ImageView) findViewById(R.id.iv_img);
bt_camera = (Button) findViewById(R.id.bt_camera);
bt_xiangce = (Button) findViewById(R.id.bt_xiangce);
//从SharedPreferences获取图片
getBitmapFromSharedPreferences(); bt_camera.setOnClickListener(this);
bt_xiangce.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_camera:
// 激活相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME);
// 从文件中创建uri
Uri uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
break;
case R.id.bt_xiangce:
// 激活系统图库,选择一张图片
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setType("image/*");
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
startActivityForResult(intent1, PHOTO_REQUEST_GALLERY);
break;
}
} /*
* 判断sdcard是否被挂载
*/
private boolean hasSdcard() {
//判断SD卡手否是安装好的   media_mounted
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
} /*
* 剪切图片
*/
private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", );
intent.putExtra("aspectY", );
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", );
intent.putExtra("outputY", ); intent.putExtra("outputFormat", "JPEG");// 图片格式
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
} /**
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
crop(uri);
}
} else if (requestCode == PHOTO_REQUEST_CAREMA) {
// 从相机返回的数据
if (hasSdcard()) {
crop(Uri.fromFile(tempFile));
} else {
Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PHOTO_REQUEST_CUT) {
// 从剪切图片返回的数据
if (data != null) {
Bitmap bitmap = data.getParcelableExtra("data");
/**
* 获得图片
*/
iv_img.setImageBitmap(bitmap);
//保存到SharedPreferences
saveBitmapToSharedPreferences(bitmap);
}
try {
// 将临时文件删除
tempFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
} //保存图片到SharedPreferences
private void saveBitmapToSharedPreferences(Bitmap bitmap) {
// Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, , byteArrayOutputStream);
//第二步:利用Base64将字节数组输出流中的数据转换成字符串String
byte[] byteArray = byteArrayOutputStream.toByteArray();
String imageString = new String(Base64.encodeToString(byteArray, Base64.DEFAULT));
//第三步:将String保持至SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("testSP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("image", imageString);
editor.commit(); //上传头像
setImgByStr(imageString,"");
} /**
* 上传头像 此处使用用的OKHttp post请求上传的图片
* @param imgStr
* @param imgName
*/
public void setImgByStr(String imgStr, String imgName) {
String url = "http://appserver。。。。。。。";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "参数值");//
params.put("data", imgStr);
OkHttp.postAsync(url, params, new OkHttp.DataCallBack() {
@Override
public void requestFailure(Request request, IOException e) {
Log.i("上传失败", "失败" + request.toString() + e.toString());
}
@Override
public void requestSuccess(String result) throws Exception {
Log.i("上传成功", result);
}
});
} //从SharedPreferences获取图片
private void getBitmapFromSharedPreferences(){
SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);
//第一步:取出字符串形式的Bitmap
String imageString=sharedPreferences.getString("image", "");
//第二步:利用Base64将字符串转换为ByteArrayInputStream
byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);
if(byteArray.length==){
iv_img.setImageResource(R.mipmap.ic_launcher);
}else{
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray); //第三步:利用ByteArrayInputStream生成Bitmap
Bitmap bitmap= BitmapFactory.decodeStream(byteArrayInputStream);
iv_img.setImageBitmap(bitmap);
} } } //下面是我封装的一个 OKHttp
注意:需要在build.gradle 中添加下面这句,然后在同步一下
compile 'com.squareup.okhttp3:logging-interceptor:3.4.2' //----------下面是封装的OKHttp类------------------ package tckpicture.bwie.com.tackpicture2; import android.os.Handler;
import android.os.Looper; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit; import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor; /**
* Created by fan on 2016/11/9.
*/ public class OkHttp { /**
* 静态实例
*/
private static OkHttp sOkHttpManager; /**
* okhttpclient实例
*/
private OkHttpClient mClient; /**
* 因为我们请求数据一般都是子线程中请求,在这里我们使用了handler
*/
private Handler mHandler; /**
* 构造方法
*/
private OkHttp() {
// // 可以通过实现 Logger 接口更改日志保存位置
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // mClient = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();
mClient = new OkHttpClient();
/**
* 在这里直接设置连接超时.读取超时,写入超时
*/ OkHttpClient.Builder builder = mClient.newBuilder();
builder.connectTimeout(, TimeUnit.SECONDS);
builder.readTimeout(, TimeUnit.SECONDS);
builder.writeTimeout(, TimeUnit.SECONDS);
builder.addInterceptor(loggingInterceptor);
mClient = builder.build(); /**
* 如果是用的3.0之前的版本 使用以下直接设置连接超时.读取超时,写入超时
*/ //client.setConnectTimeout(10, TimeUnit.SECONDS);
//client.setWriteTimeout(10, TimeUnit.SECONDS);
//client.setReadTimeout(30, TimeUnit.SECONDS); /**
* 初始化handler
*/
mHandler = new Handler(Looper.getMainLooper());
} /**
* 单例模式 获取OkHttp实例
*
* @return
*/
public static OkHttp getInstance() { if (sOkHttpManager == null) {
sOkHttpManager = new OkHttp();
}
return sOkHttpManager;
} //-------------------------同步的方式请求数据-------------------------- /**
* 对外提供的get方法,同步的方式
*
* @param url 传入的地址
* @return
*/
public static Response getSync(String url) { //通过获取到的实例来调用内部方法
return sOkHttpManager.inner_getSync(url);
} /**
* GET方式请求的内部逻辑处理方式,同步的方式
*
* @param url
* @return
*/
private Response inner_getSync(String url) {
Request request = new Request.Builder().url(url).build();
Response response = null;
try {
//同步请求返回的是response对象
response = mClient.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
return response;
} /**
* 对外提供的同步获取String的方法
*
* @param url
* @return
*/
public static String getSyncString(String url) {
return sOkHttpManager.inner_getSyncString(url);
} /**
* 同步方法
*/
private String inner_getSyncString(String url) {
String result = null;
try {
/**
* 把取得到的结果转为字符串,这里最好用string()
*/
result = inner_getSync(url).body().string();
} catch (IOException e) {
e.printStackTrace();
}
return result;
} //-------------------------异步的方式请求数据--------------------------
public static void getAsync(String url, DataCallBack callBack) {
getInstance().inner_getAsync(url, callBack);
} /**
* 内部逻辑请求的方法
*
* @param url
* @param callBack
* @return
*/
private void inner_getAsync(String url, final DataCallBack callBack) {
final Request request = new Request.Builder().url(url).build(); mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
deliverDataFailure(request, e, callBack);
} @Override
public void onResponse(Call call, Response response) throws IOException {
String result = null;
try {
result = response.body().string();
} catch (IOException e) {
deliverDataFailure(request, e, callBack);
}
deliverDataSuccess(result, callBack);
}
});
} /**
* 分发失败的时候调用
*
* @param request
* @param e
* @param callBack
*/
private void deliverDataFailure(final Request request, final IOException e, final DataCallBack callBack) {
/**
* 在这里使用异步处理
*/
mHandler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
callBack.requestFailure(request, e);
}
}
});
} /**
* 分发成功的时候调用
*
* @param result
* @param callBack
*/
private void deliverDataSuccess(final String result, final DataCallBack callBack) {
/**
* 在这里使用异步线程处理
*/
mHandler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.requestSuccess(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
} /**
* 数据回调接口
*/
public interface DataCallBack {
void requestFailure(Request request, IOException e); void requestSuccess(String result) throws Exception;
} //-------------------------提交表单-------------------------- public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) {
getInstance().inner_postAsync(url, params, callBack);
} private void inner_postAsync(String url, Map<String, String> params, final DataCallBack callBack) { RequestBody requestBody = null;
if (params == null) {
params = new HashMap<>();
} /**
* 如果是3.0之前版本的,构建表单数据是下面的一句
*/
//FormEncodingBuilder builder = new FormEncodingBuilder(); /**
* 3.0之后版本
*/
FormBody.Builder builder = new FormBody.Builder(); /**
* 在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找
*/
for (Map.Entry<String, String> map : params.entrySet()) {
String key = map.getKey().toString();
String value = null;
/**
* 判断值是否是空的
*/
if (map.getValue() == null) {
value = "";
} else {
value = map.getValue();
}
/**
* 把key和value添加到formbody中
*/
builder.add(key, value);
}
requestBody = builder.build();
//结果返回
// 请求对象
final Request request = new Request.Builder().url(url).post(requestBody).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
deliverDataFailure(request, e, callBack);
} @Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
deliverDataSuccess(result, callBack);
} });
} //-------------------------文件下载--------------------------
public static void downloadAsync(String url, String desDir, DataCallBack callBack) {
getInstance().inner_downloadAsync(url, desDir, callBack);
} /**
* 下载文件的内部逻辑处理类
*
* @param url 下载地址
* @param desDir 目标地址
* @param callBack
*/
private void inner_downloadAsync(final String url, final String desDir, final DataCallBack callBack) {
final Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
deliverDataFailure(request, e, callBack);
} @Override
public void onResponse(Call call, Response response) throws IOException { /**
* 在这里进行文件的下载处理
*/
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
try {
//文件名和目标地址
File file = new File(desDir, getFileName(url));
//把请求回来的response对象装换为字节流
inputStream = response.body().byteStream();
fileOutputStream = new FileOutputStream(file);
int len = ;
byte[] bytes = new byte[];
//循环读取数据
while ((len = inputStream.read(bytes)) != -) {
fileOutputStream.write(bytes, , len);
}
//关闭文件输出流
fileOutputStream.flush();
//调用分发数据成功的方法
deliverDataSuccess(file.getAbsolutePath(), callBack);
} catch (IOException e) {
//如果失败,调用此方法
deliverDataFailure(request, e, callBack);
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
} }
} });
} /**
* 根据文件url获取文件的路径名字
*
* @param url
* @return
*/
private String getFileName(String url) {
int separatorIndex = url.lastIndexOf("/");
String path = (separatorIndex < ) ? url : url.substring(separatorIndex + , url.length());
return path;
} } //---------------完了-----------------
package tckpicture.bwie.com.tackpicture2;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import okhttp3.Request; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView iv_img;
private Button bt_camera;
private Button bt_xiangce;
private static final int PHOTO_REQUEST_CAREMA = ;// 拍照
private static final int PHOTO_REQUEST_GALLERY = ;// 从相册中选择
private static final int PHOTO_REQUEST_CUT = ;// 结果
/* 头像名称 */
private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
private File tempFile; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
iv_img = (ImageView) findViewById(R.id.iv_img);
bt_camera = (Button) findViewById(R.id.bt_camera);
bt_xiangce = (Button) findViewById(R.id.bt_xiangce);
//从SharedPreferences获取图片
getBitmapFromSharedPreferences(); bt_camera.setOnClickListener(this);
bt_xiangce.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_camera:
// 激活相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME);
// 从文件中创建uri
Uri uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
break;
case R.id.bt_xiangce:
// 激活系统图库,选择一张图片
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setType("image/*");
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
startActivityForResult(intent1, PHOTO_REQUEST_GALLERY);
break;
}
} /*
* 判断sdcard是否被挂载
*/
private boolean hasSdcard() {
//判断SD卡手否是安装好的   media_mounted
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
} /*
* 剪切图片
*/
private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", );
intent.putExtra("aspectY", );
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", );
intent.putExtra("outputY", ); intent.putExtra("outputFormat", "JPEG");// 图片格式
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
} /**
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
crop(uri);
}
} else if (requestCode == PHOTO_REQUEST_CAREMA) {
// 从相机返回的数据
if (hasSdcard()) {
crop(Uri.fromFile(tempFile));
} else {
Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PHOTO_REQUEST_CUT) {
// 从剪切图片返回的数据
if (data != null) {
Bitmap bitmap = data.getParcelableExtra("data");
/**
* 获得图片
*/
iv_img.setImageBitmap(bitmap);
//保存到SharedPreferences
saveBitmapToSharedPreferences(bitmap);
}
try {
// 将临时文件删除
tempFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
} //保存图片到SharedPreferences
private void saveBitmapToSharedPreferences(Bitmap bitmap) {
// Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, , byteArrayOutputStream);
//第二步:利用Base64将字节数组输出流中的数据转换成字符串String
byte[] byteArray = byteArrayOutputStream.toByteArray();
String imageString = new String(Base64.encodeToString(byteArray, Base64.DEFAULT));
//第三步:将String保持至SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("testSP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("image", imageString);
editor.commit(); //上传头像
setImgByStr(imageString,"");
} /**
* 上传头像
* @param imgStr
* @param imgName
*/
public void setImgByStr(String imgStr, String imgName) {
String url = "http://appserver.1035.mobi/MobiSoft/User_upLogo";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "11460047");// 11459832
params.put("data", imgStr);
OkHttp.postAsync(url, params, new OkHttp.DataCallBack() {
@Override
public void requestFailure(Request request, IOException e) {
Log.i("上传失败", "失败" + request.toString() + e.toString());
}
@Override
public void requestSuccess(String result) throws Exception {
Log.i("上传成功", result);
}
});
} //从SharedPreferences获取图片
private void getBitmapFromSharedPreferences(){
SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);
//第一步:取出字符串形式的Bitmap
String imageString=sharedPreferences.getString("image", "");
//第二步:利用Base64将字符串转换为ByteArrayInputStream
byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);
if(byteArray.length==){
iv_img.setImageResource(R.mipmap.ic_launcher);
}else{
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray); //第三步:利用ByteArrayInputStream生成Bitmap
Bitmap bitmap= BitmapFactory.decodeStream(byteArrayInputStream);
iv_img.setImageBitmap(bitmap);
} } }

Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切的更多相关文章

  1. Android 从相机或相册或获取图片(转)

    参考: https://github.com/ASDbobo/GetPhotoDemo Android 8.0 调取系统摄像头和相册选择图片 9.3 使用Camera拍照

  2. Android 多线程:使用Thread和Handler (从网络上获取图片)

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分 ...

  3. Android上传头像代码,相机,相册,裁剪

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  4. iOS-iOS调用相机调用相册【将图片保存到本地相册】

    设置头部代理 <UINavigationControllerDelegate, UIImagePickerControllerDelegate> 1.调用相机 检测前置摄像头是否可用 - ...

  5. android拍照获得图片及获得图片后剪切设置到ImageView

    ok,这次的项目需要用到设置头像功能,所以做了个总结,直接进入主题吧. 先说说怎么 使用android内置的相机拍照然后获取到这张照片吧 直接上代码: Intent intentFromCapture ...

  6. Swift4.0 从相册中获取图片和拍照

    第一步 添加协议 UIImagePickerControllerDelegate,UINavigationControllerDelegate   第二步 添加选择方式 let sexActionSh ...

  7. Android调用相机实现拍照并裁剪图片,调用手机中的相冊图片并裁剪图片

    在 Android应用中,非常多时候我们须要实现上传图片,或者直接调用手机上的拍照功能拍照处理然后直接显示并上传功能,以下将讲述调用相机拍照处理图片然后显示和调用手机相冊中的图片处理然后显示的功能,要 ...

  8. Android中调用系统的相机和图库获取图片

    //--------我的主布局文件------很简单---------------------------------<LinearLayout xmlns:android="http ...

  9. JS中调用android和ios系统手机打开相机并可选择相册功能

    编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/57626154 实现android手机打开相机选择相册 ...

随机推荐

  1. Android---控制设备照相机

    本文译自:http://developer.android.com/training/camera/cameradirect.html 本文中,我们讨论如何使用框架API来直接的控制照相机硬件. 直接 ...

  2. Python中的eval()、exec()及其相关函数

    刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档.这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals().locals()和compile() ...

  3. KendoUI 用下来的小总结

    Kendoui Aspnetmvc * 引用jquery.1.10以上 * 1.项目引用 Kendo.Mvc.dll 2.页面引用 @using Kendo.Mvc.UI; 3.Name和 HtmlA ...

  4. 做个简单的Redis监控(源码分享)

    Redis监控 Redis 是目前应用广泛的NoSQL,我做的项目中大部分都是与Redis打交道,发现身边的朋友也更多人在用,相对于memcached 来说,它的优势也确实是可圈可点.在随着业务,数据 ...

  5. 无U盘安装Linux openSUSE(通过硬盘安装Linux)

    一.说明 为什么会想着用硬盘安装Linux?只是因为我陆陆续续买了两个U盘,然后它们都丢了,就没再买了.然而现在又想装个openSUSE,没有U盘,只能想办法通过硬盘安装. 记录自己走过的弯路,同时也 ...

  6. [Node.js]REPL(交互式解释器)

    摘要 REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的 ...

  7. Server Tomcat v6.0 at localhost was unable to start within 45 seconds

    在eclipse里启动tomcat的时候出现以下的错误: Server Tomcat v6.0 at localhost was unable to start within 45 seconds. ...

  8. Float 的那些事

    css float 定义元素浮动到左侧或者右侧.其出现的本意是让文字环绕图片而已. left.right.inherit(从父级元素获取float值).none 一.浮动的性质 1. 包裹性 disp ...

  9. centos 安装apache activemq

    安装说明 安装环境:CentOS-6.3 安装方式:源码安装  软件:apache-tomcat-7.0.29.tar.gz下载地址http://activemq.apache.org/downloa ...

  10. Linux下的暴力密码在线破解工具Hydra安装及其组件安装-使用

    Linux下的暴力密码在线破解工具Hydra安装及其组件安装-使用 hydra可以破解: http://www.thc.org/thc-hydra,可支持AFP, Cisco AAA, Cisco a ...