Monthly Archives: September 2011

Documentation for Ksoap, easy, easy

http://ksoap2.sourceforge.net/doc/api/

http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks

Advertisements

Load images from sdcard to Gallery in android

Gần đây tôi có làm một apps, và cảm ơn khi tôi phát hiện ra lỗ hổng kiến thức này sớm, đó là gì, thật ra đó là vấn dề với service trong android, khi tôi gửi một ArrayList từ một intent tới một service để xử lý thì trong phương thức Oncreate của Service tôi đã cố đủ mọi cách để nhận được dữ liệu từ Intent kia gửi sang nhưng nó đều vô nghĩa … sau khi tìm lại kiến thức tôi nhớ ra là nó sẽ nhận trong phương thức onStart của Service. Nếu các bạn cũng như tôi thì update nhé, trong project đó tôi sử dụng basic cách show các images bằng gallery trong android và các ảnh sẽ được load lên từ sdcard, và đây là mã tôi sử dụng.

package hoasen.edu.vn;

import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Gallery;
import android.widget.Toast;

public class ViewPhoto extends Activity {
	
	private Gallery gallery;
    private ImageView imgView;

    private  String imageInSD = "";
    private String[] Imgid;

    
    @Override
    public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.slidephoto);
          
           imgView = (ImageView) findViewById(R.id.ImageView01);
           gallery = (Gallery)   findViewById(R.id.examplegallery);
           
           SharedPreferences sharepre = PreferenceManager.getDefaultSharedPreferences(hoasen.edu.vn.ViewPhoto.this);
   		   String forder = sharepre.getString("forder", "Vnexpress");
   		   imageInSD = "/sdcard/" + forder + "/";
   		   
   		   File file = new File(imageInSD);
   		   File[] listoffile = file.listFiles();
   		   Imgid = new String[listoffile.length];
   		   
   		   for(int i=0; i<listoffile.length; i++){
   			   if(listoffile[i].isFile()){
   				  // if(listoffile[i].)
   				   Imgid[i] = listoffile[i].getName();
   				   Log.d("IMAGES", Imgid[i]);
   			   }
   		   }
   		   
   		   
          
           Bitmap bitmap = BitmapFactory.decodeFile(imageInSD+Imgid[0]);
           Log.d("Imgid[0]", imageInSD+Imgid[0]);
           imgView.setImageBitmap(bitmap);
           
          
           imgView.setOnLongClickListener(new View.OnLongClickListener() {
			
        	   @Override
        	   public boolean onLongClick(View view) {
        		 // Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_LONG).show();
        		   	int pos = view.getId();
        		  //Imgid[pos] = null;
        		   	String filename =  Imgid[pos];
        		   	Log.d("IMAGEVIEW CLICK : ", filename);
        		  	File testfile = new File(imageInSD);
  					File[] listoffile = testfile.listFiles();
  	  		  
  	  		   		for(int j=0; j<listoffile.length; j++){
  	  		   			if(listoffile[j].isFile()){
  	  		   				Log.d("IMAGEVIEW CLICK ---->  : ", listoffile[j].getName());
  	  		   				if(listoffile[j].getName().equals(filename)){
  	  		   					listoffile[j].delete();
  	  		   					//Toast.makeText(getApplicationContext(), "Co chay vao day khong", Toast.LENGTH_LONG).show();
  	  		   					Imgid[pos] = null;
  	  		   				}
  	  		   			}
  	  		   		}
  	  		   		
  	  		   		//gallery.removeViewAt(pos);
  	  		   		gallery.refreshDrawableState();
        		  Toast.makeText(getApplicationContext(), "Đã Xóa File Ảnh Này Trong Sdcard Của Bạn", Toast.LENGTH_LONG).show();
        		  return true;
        	   }
           });
           gallery.setAdapter(new AddImgAdp(this));
           
           gallery.setOnItemClickListener(new OnItemClickListener() {
                  public void onItemClick(AdapterView parent, View v, int position,  long id) {
                	  Bitmap bitmap = BitmapFactory.decodeFile(imageInSD+Imgid[position]);   
                	  if(bitmap == null){
                		  Toast.makeText(getApplicationContext(), "Ảnh Đã Được Xóa", Toast.LENGTH_LONG).show();
                	  }
                	  else{
                      imgView.setImageBitmap(bitmap);
                      imgView.setId(position);}
                  }
            });
      }


       public class AddImgAdp extends BaseAdapter {
              int GalItemBg;
              private Context cont;


              public AddImgAdp(Context c) {
                     cont = c;
                     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme);
                     GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0);
                     typArray.recycle();
             }


             public int getCount() {
                   return Imgid.length;
             }


             public Object getItem(int position) {
                   return position;
             }


             public long getItemId(int position) {
                   return position;
             }


             public View getView(int position, View convertView, ViewGroup parent) {
                    ImageView imgView = new ImageView(cont);
                    
                    Bitmap bitmap = BitmapFactory.decodeFile(imageInSD+Imgid[position]);                
                    imgView.setImageBitmap(bitmap);
                    
                   // imgView.setLayoutParams(new Gallery.)
                    imgView.setLayoutParams(new Gallery.LayoutParams(80, 70));
                    imgView.setScaleType(ImageView.ScaleType.FIT_XY);
                    imgView.setBackgroundResource(GalItemBg);

                    return imgView;
             }
      }
}

Chỉ Mang Tính Chất Tham Khảo

Lấy link ảnh từ một file html

Source code …Lấy link ảnh từ một trang của Vnexpress, Code chỉ mang tính chất tham khảo

	package hoasen.edu.vn;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;


public class LoadContent extends Activity {
	
	private List<String> images = new ArrayList<String>();
	TextView tv;
	WebView webview;
	String url = "";
	ProgressBar loadingProgressBar,loadingTitle;
	private String temp = "";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.webview);
		
		url = getIntent().getStringExtra("URL");
		//url = "http://vnexpress.net/gl/the-thao/bong-da/2011/09/barca-danh-mat-chien-thang-o-phut-bu-gio/";
		
		tv = (TextView)findViewById(R.id.pc); 
		webview =  (WebView) this.findViewById(R.id.webview);
		webview.getSettings().setJavaScriptEnabled(true); 
		webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
		StringBuilder result = new StringBuilder();
		
		try{
					HttpClient client = new DefaultHttpClient();
					HttpGet request = new HttpGet(url);
					HttpResponse response = client.execute(request);
			
					
					BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
					String line = "";
				
					int space = 0;
					while ((line = rd.readLine()) != null) {
					
						if(line.startsWith("<H2 class=Lead>"))
							space++;
						if(space == 1){
							if(line.startsWith("<H2 class=Lead>")){
								result.append(line);	
							}
							if(!line.contains("</div>")){
								result.append(line);
							}else
								break;
						}		
						
					}
		
					String ct = result.toString(); 
	
					try{
			
							temp = result.toString();
							if(ct.lastIndexOf("</STRONG></P>") != -1 && ct.indexOf("<script") == -1);
							else{
				
								StringBuilder str = new StringBuilder();
								str.append(temp);
				
								if(temp.lastIndexOf("<TABLE") > temp.lastIndexOf("</P>")){
									temp = result.delete(temp.lastIndexOf("<TABLE"), temp.length()).toString();
								}
								if(str.indexOf("<script") != -1){
									temp = result.toString();
									temp = result.delete(temp.indexOf("<script"), temp.length()).toString();
								}
							}
					}catch(Exception exp){				
							temp = result.toString();
							Log.d("CATCH :", "CATCH");
					}
		
				
				temp = result.delete(result.toString().indexOf("<H2"), result.toString().indexOf("</H2>")).toString();
				
				Pattern p = Pattern.compile("/Files");
			    Matcher m = p.matcher(temp);
			    temp = m.replaceAll("http://vnexpress.net/Files");
			    
			    Pattern p1 = Pattern.compile("H2");
			    Matcher m1 = p1.matcher(temp);
			    temp = m1.replaceAll("H4");
			    
				webview.loadData("<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><body>" + temp + "</body></html>", "text/html", "utf-8");		
				
	
				//Toast.makeText(getApplicationContext(), temp, Toast.LENGTH_LONG).show();	
			
				////////////////////////////////////////////////////
				//StringBuilder str = new StringBuilder();
			    
				//int len = temp.length();
				//int i=0;
				/*
				 Neu nhu co the src thi :
				  		 - lay index tai vi tri do
				  		 - cho vong for voi index bat dau la tai vi tri co the src, ket thuc la dau .
				  		 - sau khi ket thuc vong for thi :
				  		 		- String ban dau se duoc cat tu vi tri ket thuc vong For cho den ket thuc temp
				  		 		- 
				  
				 */
				
			   while(temp.indexOf("src") !=-1){
			  			    	
			    		StringBuilder tempstr = new StringBuilder();
			    	
			    		int imageindex = temp.indexOf("src")+5;
			    		int j = imageindex;
			    		
			    		char s = temp.charAt(j);
			    		
			   		
			    		while(s != '"'){
			    			tempstr.append(s);
			    			j++;
			    			s = temp.charAt(j);		    			
			    		}
			    		
			    		images.add(tempstr.toString());
			    		StringBuilder newstr = new StringBuilder();
			    		newstr.append(temp);
			    		
			    		newstr.delete(0, j+1);
			    		
			    		temp = newstr.toString();	
			    		
			    }
			   
		}catch(Exception exp){				
			temp = result.toString();
			Toast.makeText(getApplicationContext(), exp.toString(), Toast.LENGTH_LONG).show();
		}
		for(int k=0; k<images.size(); k++){
	    	System.out.println("IMAGES TAG :" + images.get(k));
	    	Toast.makeText(getApplicationContext(),images.get(k), Toast.LENGTH_LONG).show();
	    }
	}
	
	public String getContent(){
		return new String("");
	}
}
	
		

Small Tip Of WebView In Android

Nếu như chúng ta viết ứng dụng đọc tin Online thì việc sử dụng WebView là chắc chắn, bạn có thể có hai chế độ cho người dụng trực tiếp xem với WebView mặc định của Android khi làm điều này thì bạn không cần phải lo lắng về việc hiển thị văn bản mà có mã UTF-8 (như tiếng Vietnamese, japanes, hay chinese …).

– Trong trường hợp bạn download thông tin site đó với một InputStream thì sau khi bạn tách những thứ cần thiết thì bạn cần để ý tới việc hiển thị tiếng việt cho nó, mã như sau .

	webview.loadData("
                          webview.loadData("<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><body>" + temp + "</body></html>", "text/html", "utf-8");
		
		

– Một câu hỏi đặt ra là WebView cho hiển thị những images trong nó mà phần html nó load lên không phải là online, câu trả lời là có, nó hoạt động nhưng bạn code html như bình thường chỉ cần link ảnh là tồn tại. Khi bạn download thông tin site về thì những link ảnh thường là các đường dẫn tương đối, nên không thể hiển thị chính xác được, do đó nếu bạn xác định được link ảnh như sau :

<IMG src = "/FILES/android.png" thì việc bạn phải làm là gắn thêm domain vào trước chuỗi này trong trường hợp này bạn chuyển thành <IMG src = "http://xxxx/FILES/android.png&quot;, và để làm được điều này thì bạn có thể xử dụng Regular Expression.

                    Pattern p = Pattern.compile(REGEX);
		    Matcher m = p.matcher(temp); 
		    temp = m.replaceAll(REPLACE);