android 拍照上传文件 原生定位
最近公司需要一个android拍照上传和定位功能的的单一功能页面,一开始选择ionic cordova angular的一套H5框架,但是遇到和上传文件报错的问题,bug找了一天没找到原因,怀疑是ionic版本问题,但是不重要了,不过有想继续研究问题的代码给你们,加油呀
git@github.com:tsxylhs/ionic-image-upload.git
因为赶的急临时抱佛脚,一天的时间将android入门然后写了这个Demo 希望大家共同学习,全栈就得有个全栈的样子你说对不,现在说正事
首先是定位, gps定位和网络定位,动态获取权限卡了一会,贴代码瞧瞧吧,写惯了golang 再写java感觉太臃肿了。。太臃肿了。。。。。臃肿。。。。了
     System.out.println("获取经纬度");
                showGPSContacts();
哈哈哈是是不是觉得我在逗你们,这个就是click里的方法了。实现showGpsContacts,根据多年菜逼的经验代码不要乱写,会更乱,放在类里调用就好了,上核心代码
  public void showGPSContacts() {
        LocationManager lm = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
        boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (ok) {//开了定位服务
            if (Build.VERSION.SDK_INT >= 23) { //判断是否为android6.0系统版本,如果是,需要动态添加权限
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {// 没有权限,申请权限。
                    ActivityCompat.requestPermissions(MainActivity.this, LOCATIONGPS,
                            BAIDU_READ_PHONE_STATE);
                } else {
                    getLocation();//getLocation为定位方法
                }
            } else {
                getLocation();//getLocation为定位方法
            }
        } else {
            Toast.makeText(MainActivity.this, "系统检测到未开启GPS定位服务,请开启", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivityForResult(intent, PRIVATE_CODE);
        }
    }
    /**
     * 获取具体位置的经纬度
     */
    private void getLocation() {
        // 获取位置管理服务
        LocationManager locationManager;
        String serviceName = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) MainActivity.this.getSystemService(serviceName);
        // 查找到服务信息
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗
        String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息
        /**这段代码不需要深究,是locationManager.getLastKnownLocation(provider)自动生成的,不加会出错**/
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置
        updateLocation(location);
    }
    /**
     * 获取到当前位置的经纬度
     *
     * @param location
     */
    private void updateLocation(Location location) {
        if (location != null) {
            lat = location.getLatitude();
             lng= location.getLongitude();
            locationSuccess = new AlertDialog.Builder(MainActivity.this)
                    .setTitle("提示信息")//标题
                    .setMessage("获取定位成功!")//内容
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, "获取定位成功", Toast.LENGTH_SHORT).show();
                            dialog.dismiss();
                        }
                    }).setIcon(R.mipmap.ic_launcher).create();//图标
            locationSuccess.show();
            System.out.println("lat"+lat+":"+"location"+lng);
        } else {
            System.out.println("获取失败");
            locationError = new AlertDialog.Builder(MainActivity.this)
                    .setTitle("定位失败")//标题
                    .setMessage("获取定位失败联系开发者:17615855621!")//内容
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, "获取定位失败", Toast.LENGTH_SHORT).show();
                            dialog.dismiss();
                        }
                    }).setIcon(R.mipmap.ic_launcher).create();//图标
            locationError.show();
        }
    }
}
其实我也是从网上找的例子,读一读,看一看 control c v 拿过来,这个就是拿来主义
AndroidManifest.xml 引入权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
没有什么大毛病的话定位就走起了
接下来就是要拍照上传了这个说实话真耽误了一些功夫,没办法有拿来主义,就要有分享精神(哈哈)自吹自擂的话就不说了上代码
//设置图片的保存路径,作为全局变量
System.out.println("打开摄像头拍照");
intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, PICK);
套路一样,逻辑分类些,就像是上海的垃圾分类,博主每天接收大妈的审问,我是什么垃圾,代码也一样,代码不分类也是和垃圾一样(丑呀)
重写
onActivityResult此方法
然后将
Bitmap 转换为文件 初步工作完成
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK:
if (resultCode == RESULT_OK) {
//将拍摄的照片显示出来
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
base64ImageData = bitmapToBase64(bitmap);
imageView.setImageBitmap(bitmap);
file= compressImage(bitmap);
// 拍照完成并且显示完成
// todo 上传图片和位置信息 }
break;
default:
break;
}
}
//转换文件
public File compressImage(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
String filename = format.format(date);
File file = new File(Environment.getExternalStorageDirectory(), filename + ".png");
try {
FileOutputStream fos = new FileOutputStream(file);
try {
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return file;
}
上传有点乱将就吧,天不早该睡觉了,有些业务上的逻辑请忽略
  System.out.println("上传图片");
                address = editTextAddress.getText().toString();
                deviceId = editTextDeviceId.getText().toString();
                System.out.println("address:" + address);
                if (address==""||deviceId==""||lng==0.0||lat==0.0) {
                    alertDialog1 = new AlertDialog.Builder(MainActivity.this)
                            .setTitle("错误")//标题
                            .setMessage("内容未完善!")//内容
                            .setPositiveButton("重新完善内容", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Toast.makeText(MainActivity.this, "重新完善内容", Toast.LENGTH_SHORT).show();
                                    dialog.dismiss();
                                }
                            }).setIcon(R.mipmap.ic_launcher).create();//图标
                    alertDialog1.show();
                } else {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
                            RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file);
                            RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                                    .addFormDataPart("file", deviceId, fileBody)
                                    .addFormDataPart("address", address)
                                    .addFormDataPart("deviceId", deviceId)
                                    .addFormDataPart("latlong", lat + ":" + lng).build();
                            Request request = new Request.Builder().url(url).post(requestBody).build();
                            okHttpClient.newCall(request).enqueue(new Callback() {
                                @Override
                                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                                    Log.i("response:", e.toString());
                                    Looper.prepare();
                                  AlertFailure= new AlertDialog.Builder(MainActivity.this)
                                            .setTitle("上传失败")//标题
                                            .setMessage("上传失败请联系开发者:17615855621!")//内容
                                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                    Toast.makeText(MainActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
                                                    dialog.dismiss();
                                                }
                                            }).setIcon(R.mipmap.ic_launcher).create();//图标
                                    AlertFailure.show();
                                    Looper.loop();
                                    System.out.println(e.getMessage());
                                }
                                @Override
                                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                                    Log.i("response:", response.toString());
                                    Looper.prepare();
                                   AlerDialogsuccess= new AlertDialog.Builder(MainActivity.this)
                                            .setTitle("上传成功")//标题
                                            .setMessage("上传成功!")//内容
                                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                    Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
                                                    dialog.dismiss();
                                                }
                                            }).setIcon(R.mipmap.ic_launcher).create();//图标
                                    AlerDialogsuccess.show();
                                    Looper.loop();
                                    System.out.println("上传成功");
                                }
                            });
                        }
                    }).start();
                }
AndroidManifest.xml 引入权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
至此便大获全胜。本教程只适合1天android工龄人查看,大神请绕路行驶,以免发生车祸
页面要不要贴。。。。。不贴了吧都是拖出来的毫无美感可言
最后源代码来啦请注意查收:
https://github.com/tsxylhs/android-image-upload
谢谢,欢迎留言交流
android 拍照上传文件 原生定位的更多相关文章
- android Volley 上传文件上传图片
		Volley不解释了吧, android 官方的一个网络请求库. 源码的地址在: git@github.com:com314159/VolleyMultiPartRequest.git 上面的是ssh ... 
- 关于Android WebView上传文件的解决方案
		我们在开发需求的时候,难免会接入一下第三方的H5页面,有些H5页面是具有上传照片的功能,Android 中的 WebView是不能直接打开文件选择弹框的 接下来我讲简单提供一下解决方案,先说一下思路 ... 
- mono for android Json 上传文件
		void button_Click(object sender, EventArgs e) { string Url = "上传地址,服务器端负责接收"; byte[] fbyte ... 
- Android webview 上传文件不调用openFileChooser解决办法
		html页面带有图片上传功能,关于使用openFileChooser方法去选择图片,并且在onActivityResult方法里面设置返回的图片url文件路径,网上有很多,再次不再赘述. 实践中发现, ... 
- android 模拟器上传文件 Read-only file system
		在cmd窗口一条命令就可以了:adb shellmount -o remount rw / 
- Android应用开发中webview上传文件的几种思路
		1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ... 
- android 上传文件
		android对于上传文件,还是非常easy的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!另一个特别重要的就是须要一些content-type这些參数的配置! 假设这些都弄好 ... 
- 前端之web上传文件的方式
		前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ... 
- 第九篇:web之前端之web上传文件的方式
		前端之web上传文件的方式 前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ... 
随机推荐
- 随机森林之oob的计算过程
			随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计.它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计. 随机森林在生成每颗决策 ... 
- Java学习笔记-Java中的常用类
			Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ... 
- c++ static_cast和dynamic_cast详解
			注:从图中可以看出,派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性.当我们从派生类向基类转换时,不管用传统的c语言还是c++转换方式都可以百分百转换成功.但是可怕是向下转换类型,也 ... 
- 在Hadoop中ResourceManager是干什么的?
			[学习笔记] 1)ResourceManager:马克-to-win @ 马克java社区:防盗版实名手机尾号:73203.当应用程序对集群资源需求时,ResourceManager是Yarn集群主控 ... 
- ARST第四周打卡
			Algorithm : 做一个 leetcode 的算法题 ////////////////////////////////////////////////////////////////////// ... 
- crm--rbac权限组件使用步骤
			本人的权限组件码云地址:https://gitee.com/shiguanggege/rbac 里面有文档详细介绍权限组件的使用步骤 
- 异或运算符(^)、与运算符(&)、或运算符(|)、反运算符(~)、右移运算符(>>)、无符号右移运算符(>>>)
			目录 异或(^).异或和 的性质及应用总结 异或的含义 异或的性质:满足交换律和结合律 异或的应用 按位 与运算符(&) 按位 或运算符(|) 取 反运算符(~) 右移运算符(>> ... 
- JS中的继承(上)
			JS中的继承(上) 学过java或者c#之类语言的同学,应该会对js的继承感到很困惑--不要问我怎么知道的,js的继承主要是基于原型(prototype)的,对js的原型感兴趣的同学,可以了解一下我之 ... 
- SpringBoot 进阶
			SpringBoot 进阶 这里讲两个小方面: 表单验证 AOP 1. 表单验证 SpringBoot 中的表单验证功能步骤如下: 在 controller 类中将用 @PathVariable 和 ... 
- codeforce C. Success Rate
			写完这道题目才发现自己对二分的理解太浅了 这题是典型的利用二分“假定一个问题可行并求最优解” 二分是通过不断缩小区间来缩小解的范围,最终得出解的算法 我们定义一个c(x) 表示判断函数 如果对任意y& ... 
