mainactivity代碼
package com.bwie.webviewupload; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; 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.util.Base64; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebView; public class MainActivity extends Activity { private ValueCallback<Uri> mUploadMessage; public static final int NONE = 0; public static final int PHOTO_CAMERA = 1;// 相機拍照 public static final int PHOTO_COMPILE = 2; // 編輯圖片 public static final int PHOTO_RESOULT = 3;// 結果 private String ImageName; Bitmap myBitmap; private byte[] mContent; public static String getStringToday() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); String dateString = formatter.format(currentTime); return dateString; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 找控件 final WebView wv = (WebView) findViewById(R.id.wv); // 設置js有效 wv.getSettings().setJavaScriptEnabled(true); // 為wv加載網絡頁面 wv.loadUrl("http://101.200.142.201/Login/register.html"); // 為wv設置js交互 wv.setWebChromeClient(new WebChromeClient() { // 進行上傳 @SuppressWarnings("unused") public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; // 在下方彈出poppupWindow MyPopupWindow pop = new MyPopupWindow(MainActivity.this, new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 判斷 switch (v.getId()) { case R.id.btn_pick_photo: // 設置調用系統相冊的意圖(隱式意圖) Intent intent = new Intent(); // 設置值活動//android.intent.action.PICK intent.setAction(Intent.ACTION_PICK); // 設置類型和數據 intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); // 開啟系統的相冊 startActivityForResult(intent, PHOTO_COMPILE); break; case R.id.btn_take_photo: // 設置圖片的名稱 ImageName = "/" + getStringToday() + ".jpg"; // 設置調用系統攝像頭的意圖(隱式意圖) Intent intent1 = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); // 設置照片的輸出路徑和文件名 File file = new File(Environment .getExternalStorageDirectory(), ImageName); intent1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); // 開啟攝像頭 startActivityForResult(intent1, PHOTO_CAMERA); break; case R.id.btn_cancel: break; } } }); // 顯示窗口 main 為mainactivity的主控件 pop.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); // 設置layout在PopupWindow中顯示的位置 } }); } // 調用startActivityResult,返回之后的回調函數 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { ContentResolver resolver = getContentResolver(); // 照片的處理結果 if (requestCode == PHOTO_COMPILE) { //進行圖片的壓縮 String path = getAbsoluteImagePath(data.getData()); Bitmap bitmap = getimage(path);
//轉成url Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage( getContentResolver(), bitmap, null, null)); Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
//上傳圖片 mUploadMessage.onReceiveValue(result); mUploadMessage = null; } if (requestCode == PHOTO_CAMERA)// 拍照 { // 設置文件保存路徑這里放在跟目錄下 File picture = new File(Environment.getExternalStorageDirectory() + ImageName); //進行圖片的壓縮 Bitmap bitmap1 = getimage(picture.getPath()); //轉成url Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage( getContentResolver(), bitmap1, null, null));
//上傳圖片 mUploadMessage.onReceiveValue(imageUri); mUploadMessage = null; } super.onActivityResult(requestCode, resultCode, data); } // http://blog.csdn.net/cherry609195946/article/details/9264409 // android圖片壓縮總結 // // 圖片按比例大小壓縮方法(根據Bitmap圖片壓縮) // 壓縮圖片url private Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); // 開始讀入圖片,此時把options.inJustDecodeBounds 設回true了 newOpts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此時返回bm為空 newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; // 現在主流手機比較多是800*480分辨率,所以高和寬我們設置為 float hh = 800f;// 這里設置高度為800f float ww = 480f;// 這里設置寬度為480f // 縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可 int be = 1;// be=1表示不縮放 if (w > h && w > ww) {// 如果寬度大的話根據寬度固定大小縮放 be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) {// 如果高度高的話根據寬度固定大小縮放 be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;// 設置縮放比例 // 重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了 bitmap = BitmapFactory.decodeFile(srcPath, newOpts); return compressImage(bitmap);// 壓縮好比例大小后再進行質量壓縮 } private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質量壓縮方法,這里100表示不壓縮,把壓縮后的數據存放到baos中 int options = 100; while (baos.toByteArray().length / 1024 > 100) { // 循環判斷如果壓縮后圖片是否大於100kb,大於繼續壓縮 baos.reset();// 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這里壓縮options%,把壓縮后的數據存放到baos中 options -= 10;// 每次都減少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把壓縮后的數據baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream數據生成圖片 return bitmap; } protected String getAbsoluteImagePath(Uri uri) { // can post image String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, proj, // Which columns to return null, // WHERE clause; which rows to return (all rows) null, // WHERE clause selection arguments (none) null); // Order-by clause (ascending by name) int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } }
重寫popupWindow代碼
package com.bwie.webviewupload; import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.PopupWindow; public class MyPopupWindow extends PopupWindow { private Button btn_take_photo, btn_pick_photo, btn_cancel; private View mMenuView; public MyPopupWindow(Activity context, OnClickListener itemsOnClick) { super(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMenuView = inflater.inflate(R.layout.popup, null); btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo); btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo); btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel); // 取消按鈕 btn_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 銷毀彈出框 dismiss(); } }); // 設置按鈕監聽 btn_pick_photo.setOnClickListener(itemsOnClick); btn_take_photo.setOnClickListener(itemsOnClick); // 設置SelectPicPopupWindow的View this.setContentView(mMenuView); // 設置SelectPicPopupWindow彈出窗體的寬 this.setWidth(LayoutParams.FILL_PARENT); // 設置SelectPicPopupWindow彈出窗體的高 this.setHeight(LayoutParams.WRAP_CONTENT); // 設置SelectPicPopupWindow彈出窗體可點擊 this.setFocusable(true); // 設置SelectPicPopupWindow彈出窗體動畫效果 this.setAnimationStyle(R.style.mypopwindow_anim_style); // 實例化一個ColorDrawable顏色為半透明 // ColorDrawable dw = new ColorDrawable(0xb0000000); // 設置SelectPicPopupWindow彈出窗體的背景 // this.setBackgroundDrawable(dw); // mMenuView添加OnTouchListener監聽判斷獲取觸屏位置如果在選擇框外面則銷毀彈出框 mMenuView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = mMenuView.findViewById(R.id.pop_layout).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y < height) { dismiss(); } } return true; } }); } }