2013-09-06 40 views
5

Tôi đang sử dụng một Webview cho một trang đẹp và tôi cần tải lên hình ảnh. Bây giờ vấn đề, hầu hết hình ảnh trên điện thoại là 2-3MB và tôi cần phải thay đổi kích thước hình ảnh và chất lượng thấp hơn trước khi tải lên bắt đầu. Vì vậy, làm thế nào tôi có thể thay đổi kích thước nó với mã mẫu tìm thấy trên stackoverflow?Android CustomWebChromeClient openFileChooser Thay đổi kích thước hình ảnh trước khi tải lên

Mã này được mở Filechooser:

//Android 3.0 
public void openFileChooser(ValueCallback<Uri> uploadMsg) { 
    mUploadMessage = uploadMsg; 
    Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    i.addCategory(Intent.CATEGORY_OPENABLE); 
    i.setType("image/*"); 
    startActivityForResult(
     Intent.createChooser(i, "Image Browser"), 
     FILECHOOSER_RESULTCODE 
    ); 
} 

Bây giờ tôi cần một số thay đổi kích thước và tạo một bản sao và tải lên các thay đổi kích cỡ. (Tôi biết howto tạo một bản sao thay đổi kích cỡ, nhưng không làm thế nào tôi có thể tương tác với các mã trên)

Trả lời

7

tôi đã làm một số nghiên cứu và tạo ra một giải pháp với các nội dung trên SO ..

Nó sẽ trực tiếp mở phòng trưng bày từ filechooser html và thay đổi kích thước hình ảnh để lấy mẫu kích thước của 200x200 và chất lượng 75.

package it.meininserat; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Locale; 
import it.meininserat.R; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.app.ActionBar; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.BitmapFactory.Options; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.text.TextPaint; 
import android.util.Log; 
import android.view.Display; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.ViewConfiguration; 
import android.view.Window; 
import android.view.WindowManager; 
import android.webkit.ValueCallback; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings.PluginState; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.TextView; 
import android.widget.Toast; 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@SuppressLint({ "NewApi", "SetJavaScriptEnabled" }) 
public class MainActivity extends Activity { 

// Main PAGE URL !! 
String myUrl = "http://www.imagebanana.com/"; // http://www.meininserat.it/mobile"; 

boolean hasNavigationBar = false; 
AdView adView; 
WebView mWebView; 

Context context; 

ProgressDialog progDailog; 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // loader 
    progDailog = ProgressDialog.show(this, "Verbindung aufbauen..", 
      "Lade ....bitte warten....", true); 

    // Fullscreen and Menubar in ICS 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     hasNavigationBar = !ViewConfiguration.get(this) 
       .hasPermanentMenuKey(); 
     if (hasNavigationBar == true) { 
      getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
      getActionBar().show(); 
     } else { 
      ActionBar actionBar = getActionBar(); 
      actionBar.setDisplayShowTitleEnabled(false); 
      getActionBar().hide(); 

     } 
    } else { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    } 

    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.activity_main); 

    // check internet 

    if (isNetworkAvailable(context) != true) { 
     progDailog.dismiss(); 
     Toast.makeText(getApplicationContext(), 
       "Fehler ! Keine Internetverbindung.", Toast.LENGTH_LONG) 
       .show(); 
     finish(); 
    } 

    // load url 
    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.setWebViewClient(new HelloWebViewClient()); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.getSettings().setPluginState(PluginState.ON); 
    mWebView.getSettings().setPluginsEnabled(true); 
    mWebView.getSettings().setUseWideViewPort(true); 
    mWebView.getSettings().setUserAgentString(
      Locale.getDefault().getLanguage()); 

    /* 
    * Language detection URL String myDisplayLang = 
    * Locale.getDefault().getDisplayLanguage() .toString(); 
    * 
    * if (myDisplayLang.contentEquals("italiano")) { myUrl = 
    * "http://www.meininserat.it/mobile"; }else{ myUrl = 
    * "http://www.meininserat.it/mobile"; } 
    */ 

    mWebView.loadUrl(myUrl); 
    mWebView.setWebChromeClient(new CustomWebChromeClient()); 

    mWebView.setWebViewClient(new WebViewClient() { 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      progDailog.dismiss(); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, 
       String description, String failingUrl) { 
      progDailog.dismiss(); 
      Toast.makeText(getApplicationContext(), 
        "Fehler ! " + description, Toast.LENGTH_LONG).show(); 
     } 

    }); 

} 

// check internet connection 
public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager 
      .getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.menu_rate: 
     new AppRating().goToMarket(context); 
     return true; 
    case R.id.menu_exit: 
     finish(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (mWebView.canGoBack() == true) { 
      mWebView.goBack(); 
     } else { 
      finish(); 
     } 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

private class HelloWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

public static Uri getImageContentUri(Context context, File imageFile) { 
    String filePath = imageFile.getAbsolutePath(); 
    Cursor cursor = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Images.Media._ID }, 
      MediaStore.Images.Media.DATA + "=? ", 
      new String[] { filePath }, null); 
    if (cursor != null && cursor.moveToFirst()) { 
     int id = cursor.getInt(cursor 
       .getColumnIndex(MediaStore.MediaColumns._ID)); 
     Uri baseUri = Uri.parse("content://media/external/images/media"); 
     return Uri.withAppendedPath(baseUri, "" + id); 
    } else { 
     if (imageFile.exists()) { 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.DATA, filePath); 
      return context.getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     } else { 
      return null; 
     } 
    } 
} 

// Fix Upload 
private ValueCallback<Uri> mUploadMessage; 
private final static int FILECHOOSER_RESULTCODE = 1; 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent intent) { 
    if (requestCode == FILECHOOSER_RESULTCODE) { 
     if (null == mUploadMessage) 
      return; 
     if (resultCode != RESULT_OK) { 
      mUploadMessage.onReceiveValue(null); 
      return; 
     } 
     Uri result = intent.getData(); // get file 
     if (result == null) { 
      mUploadMessage.onReceiveValue(null); 
      return; 
     } 

     String fPath = getPath(result); 

     // we actually don't allow http links in gallery like google+ or 
     // facebook images 
     File file = new File(fPath); 
     if (!file.exists()) { 
      mUploadMessage.onReceiveValue(null); 
      Toast.makeText(getApplicationContext(), 
        "Please select a local Imagefile.", Toast.LENGTH_LONG) 
        .show(); 
      return; 
     } 

     // Resize+ 
     Bitmap bitmap = BitmapFactory.decodeFile(fPath); 
     int newWidth = 200; 
     int newHeight = 200; 
     Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, 
       Config.ARGB_8888); 

     float ratioX = newWidth/(float) bitmap.getWidth(); 
     float ratioY = newHeight/(float) bitmap.getHeight(); 
     float middleX = newWidth/2.0f; 
     float middleY = newHeight/2.0f; 

     Matrix scaleMatrix = new Matrix(); 
     scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 

     Canvas canvas = new Canvas(scaledBitmap); 
     canvas.setMatrix(scaleMatrix); 
     canvas.drawBitmap(bitmap, middleX - bitmap.getWidth()/2, middleY 
       - bitmap.getHeight()/2, new Paint(
       Paint.FILTER_BITMAP_FLAG)); 

     String resizedFileName = "ImageResized.png"; 
     File sdCard = Environment.getExternalStorageDirectory(); 
     File dir = new File(sdCard.getAbsolutePath()); 
     File filedir = new File(dir, resizedFileName); 

     try { 
      FileOutputStream fos = new FileOutputStream(filedir); 
      scaledBitmap.compress(CompressFormat.PNG, 70, fos); 
      fos.close(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      mUploadMessage.onReceiveValue(null); 
      return; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      mUploadMessage.onReceiveValue(null); 
      return; 
     } 

     mUploadMessage.onReceiveValue(getImageContentUri(context, filedir)); 

    } 
} 

protected class CustomWebChromeClient extends WebChromeClient { 

    // For Android > 4.1 
    public void openFileChooser(ValueCallback<Uri> uploadMsg, 
      String acceptType, String capture) { 
     openFileChooser(uploadMsg); 
    } 

    // Andorid 3.0 + 
    public void openFileChooser(ValueCallback<Uri> uploadMsg, 
      String acceptType) { 
     openFileChooser(uploadMsg); 
    } 

    // Android 3.0 
    public void openFileChooser(ValueCallback<Uri> uploadMsg) { 
     mUploadMessage = uploadMsg; 
     Intent i = new Intent(
       Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     // i.addCategory(Intent.CATEGORY_APP_GALLERY); 
     i.setType("image/*"); 
     // startActivityForResult(Intent.createChooser(i, 
     // "Image Browser"),FILECHOOSER_RESULTCODE); 
     startActivityForResult(i, FILECHOOSER_RESULTCODE); 
    } 

} 


} 

Hy vọng nó có thể giúp ai đó ...