今天我完成的很少,因为课表上显示今天是满课,从早上8点一直上到晚上9点35,下午专业课老师布置了其他任务,总之先汇报今日的学习情况。
参考博客:https://www.cnblogs.com/jenson138/p/4451484.html
今天按照这篇博客实现了从相册中选取照片或调用相机拍取照片,追加了截图,最后回显的功能。我在编写过程中捋顺了一下思路:定义一个ImageView用来显示图片;按钮上进行区分,确认是从相册获取还是使用相机拍照;回显使用bitmap,uri。
!!!:编写的代码跟参考的博客是一样的,目的主要是学习回显的思路与方法。
UI设计的xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <Button 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:onClick="gallery" 13 android:text="获取图库图片" 14 ></Button> 15 16 <Button 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:onClick="camera" 20 android:text="拍照获取图片" 21 ></Button> 22 23 <ImageView 24 android:id="@+id/iv_image" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 ></ImageView> 28 </LinearLayout>
这次没有再像昨天那样追求界面了,我选择先摸清后台功能。这里需要注意的是android:onCilck需要与后台对应的函数连接,否则会报错,我以前实现按钮一直是给出id再在后台声明,像这段代码这种调用方式我还是第一次用。
接下来看一下后台java:
1 package com.example.toa; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.content.Intent; 6 import android.graphics.Bitmap; 7 import android.net.Uri; 8 import android.os.Environment; 9 import android.provider.MediaStore; 10 import android.view.View; 11 import android.widget.ImageView; 12 import android.widget.Toast; 13 import java.io.File; 14 15 public class MainActivity extends Activity { 16 //划分,判断使用什么方法获取图片 17 private static final int PHOTO_REQUEST_CAMERA = 1; 18 private static final int PHOTO_REQUEST_GALLERY = 2; 19 private static final int PHOTO_REQUEST_CUT = 3; 20 21 private ImageView iv_image; 22 23 private static final String PHOTO_FILE_NAME = "temp_photo.jpg"; 24 private File tempFile; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 this.iv_image = (ImageView)findViewById(R.id.iv_image); 32 } 33 34 //对应xml中的onClick:gallery,这里直接调用相册 35 public void gallery(View view){ 36 Intent intent = new Intent(Intent.ACTION_PICK); 37 intent.setType("image/*"); 38 startActivityForResult(intent,PHOTO_REQUEST_GALLERY); 39 } 40 41 //对应xml中的onClick:camera,调用相机 42 public void camera(View view){ 43 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 44 if(hasSdcard()){ 45 tempFile = new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME); 46 Uri uri = Uri.fromFile(tempFile); 47 intent.putExtra(MediaStore.EXTRA_OUTPUT,uri); 48 } 49 startActivityForResult(intent,PHOTO_REQUEST_CAMERA); 50 } 51 52 //截取 53 private void crop(Uri uri){ 54 Intent intent = new Intent("com.android.camera.action.CROP"); 55 intent.setDataAndType(uri,"image/*"); 56 intent.putExtra("crop","true"); 57 //设置一比一比例 58 intent.putExtra("aspectX",1); 59 intent.putExtra("aspectY",1); 60 //设置图片大小 61 intent.putExtra("outputX",250); 62 intent.putExtra("outputY",250); 63 //保存格式 64 intent.putExtra("outputFormat","JPEG"); 65 intent.putExtra("noFaceDetection",true); 66 intent.putExtra("return-data",true); 67 startActivityForResult(intent,PHOTO_REQUEST_CUT); 68 } 69 70 //判断是否插入sd卡 71 private boolean hasSdcard(){ 72 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 73 return true; 74 }else{ 75 return false; 76 } 77 } 78 79 @Override 80 protected void onActivityResult(int requestCode, int resultCode, Intent data){ 81 //前两次判定都使用uri获取数据,但无论哪次判定都会调用截取方法 82 if(requestCode == PHOTO_REQUEST_GALLERY){ 83 if(data != null){ 84 Uri uri = data.getData(); 85 crop(uri); 86 } 87 }else if(requestCode == PHOTO_REQUEST_CAMERA){ 88 if(hasSdcard()){ 89 crop(Uri.fromFile(tempFile)); 90 }else{ 91 Toast.makeText(MainActivity.this,"未找到存储卡,无法存储照片!",Toast.LENGTH_SHORT).show(); 92 } 93 //截取方法,截取后进行图片回显 94 }else if(requestCode == PHOTO_REQUEST_CUT){ 95 if(data != null){ 96 //使用Bitmap进行回显 97 Bitmap bitmap = data.getParcelableExtra("data"); 98 this.iv_image.setImageBitmap(bitmap); 99 } 100 try{ 101 //删除临实文件 102 tempFile.delete(); 103 }catch(Exception e){ 104 e.printStackTrace(); 105 } 106 } 107 //执行 108 super.onActivityResult(requestCode,resultCode,data); 109 } 110 }
方法思路很清晰,就是获取图片数据后使用uri进行处理,在截取方法完成后使用bitmap进行回显,最后删除掉为构造uri而使用的临实文件变量。
下面附上效果图(虚拟机实现,手机没有插sd卡)
初始界面
选择在相册中选取
选择使用相机
最后的最后,附上下午老师布置的任务,使用python爬取CVPR论文的题目,链接,摘要。并完成网页或APP的可视化分类和点击显示功能。因为晚上7点有数学建模的大课,下课都9点35了,我只写了python爬取部分,代码如下:
1 import re 2 import requests 3 from bs4 import BeautifulSoup 4 5 #网址,这个网站提供了CVPR论文的题目,链接信息,还有pdf格式的论文全文 6 r = requests.get('http://openaccess.thecvf.com/ICCV2019.py') 7 soup = BeautifulSoup(r.text,'lxml') 8 #简单的按条件寻找标签 9 for item in soup.find_all('a',href=re.compile('content_ICCV_2019/html/')): 10 print(item.string) 11 print(item['href']) 12 #这里拿出的'href'没有http那段开头,想再读取链接进入网址,我在前面拼了上去,这个网址里可以获取摘要信息 13 ra = requests.get('http://openaccess.thecvf.com/'+item['href']) 14 soupa = BeautifulSoup(ra.text, 'lxml') 15 diva = soupa.find(attrs={"id": "abstract"}) 16 #根据给出的BUG信息,网址有的论文点进去发生了Not Found错误,需要加个判断语句 17 if(diva == None): 18 print("-1") 19 else: 20 print(diva.string) 21 #用来区分 22 print("____________")
一开始给的网址爬出来的是pdf网址信息。。。不知道怎么在pdf那一大段文本里单抽出摘要信息。换了一个网址就好多了,剩下的只要把爬取信息录入数据库,python部分就完成了。
项目方面,明日的安排是图片多选功能实现,并完成图片和文本录入数据库操作(核心),若有余力则考虑UI方面的设计。