概述
1. 首先在AndroidManifest.xml中进行配置权限
<!-- 这两个权限用于进行拍照存储权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 在OnCreate() 事件中判断功能,绑定事件
if (IsThereAnAppToTakePictures()) //判断本设备是否存在拍照功能
{
getqx(); //权限
btnCamera = FindViewById<Button>(Resource.Id.btnCameraClick001);
_imageView = FindViewById<ImageView>(Resource.Id.imageView1);
btnCamera.Click += Button_Clicked;
originalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(
Android.OS.Environment.DirectoryPictures
), "pic_" + SystemClock.CurrentThreadTimeMillis() + ".png");
finalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(
Android.OS.Environment.DirectoryPictures
), "pic_" + SystemClock.CurrentThreadTimeMillis() + ".png");
// android 7.0系统解决拍照的问题
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.SetVmPolicy(builder.Build());
builder.DetectFileUriExposure();
}
private async void Button_Clicked(object sender, EventArgs e)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
string[] actions = new string[] { "拍照", "从相册选择" };
var adapter = new ArrayAdapter<String>(this, Android.Resource.Layout.SimpleSpinnerItem, actions);
adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
builder.SetItems(actions, (s, e) =>
{
switch (actions[e.Which])
{
case "拍照":
try
{
// 摄像头拍摄
// TakeAPicture(sender, e);
CutImageByCamera();
}
catch (Exception ex)
{
Toast.MakeText(this, "App Camera Error:" + ex.InnerException, ToastLength.Short).Show();
}
break;
case "从相册选择":
//TakeImageAction();
try
{
// 相册选择
CutImageByImgStore();
}
catch (Exception ex)
{
Toast.MakeText(this, "App Select Photo Gallery Error:" + ex.InnerException, ToastLength.Short).Show();
}
Toast.MakeText(this, "you selected " + actions[e.Which], ToastLength.Short).Show();
break;
}
});
builder.Create();
builder.Show();
}
3. 打开相机和打开系统文件
/// <summary>
/// 调用摄像头拍摄
/// </summary>
private void CutImageByCamera()
{
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
getImageByCamera.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile));
getImageByCamera.PutExtra(MediaStore.ExtraVideoQuality, 1);
StartActivityForResult(getImageByCamera, Camera_RequestCode);
}
/// <summary>
/// 调用相册选择
/// </summary>
private void CutImageByImgStore()
{
Intent _intentCut = new Intent(Intent.ActionGetContent, null);
_intentCut.SetType("image/*");// 设置文件类型
_intentCut.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile));
_intentCut.PutExtra(MediaStore.ExtraVideoQuality, 1);
StartActivityForResult(_intentCut, PhotoGallery_RequestCode);
}
注意: Android7.0以上不支持file:// 来进行保存,需要把路径改为content://
4. 结束后回调
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (resultCode == Result.Ok)
{
if (requestCode == Camera_RequestCode)// 拍照结束裁剪
{
byte[] bitmapData;
base.OnActivityResult(requestCode, resultCode, data);
data.SetData(Android.Net.Uri.FromFile(originalFile));
CropRawPhoto(data.Data);
}
if (requestCode == PhotoGallery_RequestCode)// 选择图片
{
/*
* 若系统版本低于4.4,返回原uri
* 若高于4.4,解析uri后返回
* */
if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
var url = Android.Net.Uri.Parse("file://" + GetPath(BaseContext, data.Data));
data.SetData(url);
}
CropRawPhoto(data.Data);
}
if (requestCode == Display_RequestCode)// 裁剪后保存并显示
{
Intent intent = new Intent();
//intent.SetData(Android.Net.Uri.FromFile(finalFile));
int height = Resources.DisplayMetrics.HeightPixels;
int width = _imageView.Height;
//SetResult(Result.Ok, intent);
Bitmap bitmap = PhotoUtils.LoadAndResizeBitmap(finalFile.Path.ToString(), width, height);
PhotoUtils.SaveUrl(bitmap, DateTime.Now.ToString("yyyyMMddhhmmss"));
_imageView.SetImageBitmap(bitmap);
//清空bitmap 否则会出现oom问题 (内存泄漏)
bitmap = null;
GC.Collect();
}
}
}
上传服务器代码(客户端):
// <summary>
/// 上传图片到服务器
/// </summary>
/// <returns></returns>
public static void SaveUrl(Bitmap bitmap, string name)
{
// 创建WebClient实例
WebClient myWebClient = new WebClient();
//访问权限设置
myWebClient.Credentials = CredentialCache.DefaultCredentials;
Byte[] bitmapData = null;
try
{
// 图片转换为流
using (var stream = new MemoryStream())
{
bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
bitmapData = stream.ToArray();
}
string content = Convert.ToBase64String(bitmapData);
ContentPath contentPath = new ContentPath()
{
content = content,
pathandname = name + ".png"
};
RWMS_Android.Common.A_ASRS_001.Upload(JsonConvert.SerializeObject(contentPath));
//本地方法用不了
//FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
//Upload(bitmapData, "png", url);
//using (System.IO.FileStream fos = new FileStream(Android.OS.Environment.GetExternalStoragePublicDirectory(
//Android.OS.Environment.DirectoryPictures) + name + ".png", FileMode.Open, FileAccess.Read))
using (System.IO.FileStream fos = new FileStream(url + name + ".png", FileMode.Open, FileAccess.Read))
//{
//Stream postStream = myWebClient.OpenWrite(url, "PUT");
//if (postStream.CanWrite)
//{
// postStream.Write(bitmapData, 0, bitmapData.Length);
//}
//postStream.Close();
//}
}
catch (Exception ex)
{
}
}
上传服务器代码(接口):
[HttpPost]
public string UpdateFile([FromBody] object json)
{
JObject jObject = (JObject)JsonConvert.DeserializeObject(json.ToString());
string content = jObject["content"].ToString();
string pathandname = jObject["pathandname"].ToString();
//保存图片路径
string FilePath = ConfigurationManager.AppSettings["fileServiceStoragePath"];
//判断路径是否存在
if (!Directory.Exists(FilePath))
{
//创建路径
Directory.CreateDirectory(FilePath);
}
string SaveFilePath = Path.Combine(FilePath, pathandname);
byte[] fileBytes;
try
{
fileBytes = Convert.FromBase64String(content);
MemoryStream memoryStream = new MemoryStream(fileBytes); //1.定义并实例化一个内存流,以存放提交上来的字节数组。
FileStream fileUpload = new FileStream(SaveFilePath, FileMode.Create); ///2.定义实际文件对象,保存上载的文件。
memoryStream.WriteTo(fileUpload); ///3.把内存流里的数据写入物理文件
memoryStream.Close();
fileUpload.Close();
fileUpload = null;
memoryStream = null;
return "成功";
}
catch
{
return "失败";
}
}
最后
以上就是内向蜻蜓为你收集整理的Xamarin 打开相机 选择系统照片并上传服务器的全部内容,希望文章能够帮你解决Xamarin 打开相机 选择系统照片并上传服务器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复