android总结之照片上传
暑假,参加一个比赛,做了一个android的小项目,由于时间的关系,没能按时完成。开学已经大三了,决定还是把.NET学通了再继续android。但是毕竟花了一暑假在android上,所以决定利用空闲时间把暑假学到和用到的android知识做个总结。希望借此加深记忆,也为以后重拾android做个参考。这是本系列的第一篇,也是在园子里开博5个月以来的写的第二篇博客(真是惭愧),以后要坚持下去。
首先获得图片并在ImageButton上显示,获取图片有两种方式:拍照上传和本地上传,都是通过Intent和StartActivityForResult调用系统组件,在onActivityResult事件中取得图片,进行显示和上传 。直接上代码吧!
activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<EditText android:id="@+id/et_addRecord_txt"
style="@style/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textMultiLine"
android:lines="5"
android:gravity="top"
android:hint="在这里记下你的所见所闻吧!"/>
<ImageButton
android:id="@+id/ib_uploadImg"
android:layout_width="200dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/compose_pic_default"
android:scaleType="centerCrop">
</ImageButton>
</LinearLayout>
</RelativeLayout>
MainActivity.java
import java.util.ArrayList;
import java.util.List;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class MainActivity extends Activity {
private ImageButton img;
private ListView itemList;
private Bitmap photo;
private int REQUEST_CODE_PHOTOGRAPH=11;
private int REQUEST_CODE_LOCPIC = 12;
private Dialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
img = (ImageButton)findViewById(R.id.ib_uploadImg);
img.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
chooseType();
}
});
}
/**
* 选择获取图片的方式
*/
private void chooseType(){
dialog = new Dialog(MainActivity.this,R.style.dialog);
View dialogView = getLayoutInflater().inflate(R.layout.photo_dialog, null);
itemList = (ListView)dialogView.findViewById(R.id.itemList);
itemList.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1,getData()));
itemList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View conventView, int position,
long id) {
String state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
if(position==0){ //拍照上传
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, REQUEST_CODE_PHOTOGRAPH);
}else if(position ==1){ //本地上传
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQUEST_CODE_LOCPIC);
}
}else{
Toast.makeText(MainActivity.this,"sd卡不存在", Toast.LENGTH_LONG).show();
}
}
});
dialog.setContentView(dialogView);
//dialog.setTitle("上传照片");
dialog.show();
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("拍照上传");
data.add("本地上传");
return data;
}
/*
* 处理拍摄后得到的图片(non-Javadoc)
* @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
dialog.dismiss();
if(data!=null&&requestCode==REQUEST_CODE_PHOTOGRAPH){ //拍照上传时
Bundle extras = data.getExtras();
if(extras!=null){
photo = (Bitmap)extras.get("data");
img.setImageBitmap(photo);
//saveImage();
}else{
Toast.makeText(MainActivity.this,"未找到图片", Toast.LENGTH_LONG).show();
}
}
if(resultCode==Activity.RESULT_OK)
{
/**
* 当选择的图片不为空的话,在获取到图片的途径
*/
Uri uri = data.getData();
try {
String[] pojo = {MediaStore.Images.Media.DATA};
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(uri, pojo, null, null,null);
if(cursor!=null)
{
ContentResolver cr = this.getContentResolver();
int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(colunm_index);
/***
* 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,这样的话,我们判断文件的后缀名
* 如果是图片格式的话,那么才可以
*/
if(path.endsWith("jpg")||path.endsWith("png"))
{
photo = BitmapFactory.decodeStream(cr.openInputStream(uri));
img.setImageBitmap(photo);
}else{
}
}else{
}
} catch (Exception e) {
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
点击图片弹出的对话框,采用自定义的视图,用到的xml文件:photo_dialog.xml代码如下
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<TextView android:id="@+id/tv_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="22dp"
android:textColor="#ffffff"
android:text="上传图片"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:background="#000000"
/>
<ListView android:id="@+id/itemList"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
以上只是实现了获得拍照和本地的图片,并未实现上传功能,在下一篇将实现向服务器上传功能。