Android有用程式碼片斷(六)

傲慢的上校發表於2012-07-13

         不知不覺中,就收集了超過95條的自己感覺有意思的程式碼片段,分為五篇文章:android有用程式碼片段Android有用程式碼片段(二)Android有用程式碼片段(三)、Android有用程式碼片段(四)

Android有用程式碼片段(五)。這五篇,今天,開始第六篇的整理!這裡解釋一下,因為一、二、三都是每個有20個片段,但是在四中,由於第70個程式碼過長,所以在第四篇中,只有10個片段。 第五篇裡面有25個。    

  


九十六、java.util.MissingFormatArgumentException 錯誤

               在有站位符的列印語句中,經常會犯下一個錯誤。

       如:System.out.printf( "y=%3d "+y),就會報這個錯誤。

       應修改為:;改為System.out.printf( "y=%3d ",y)


九十七、Android判斷是Pad或者手機

public boolean isTabletDevice() {
        TelephonyManager telephony = (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
        int type = telephony.getPhoneType();
        if (type == TelephonyManager.PHONE_TYPE_NONE) {
            return true;
        } else {
            return false;
        }
    }

九十八、判斷android網路狀態

State mWifiState = null;
            State mMobileState = null;
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            mWifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
            mMobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                    .getState();
            if (mWifiState != null && mMobileState != null && State.CONNECTED != mWifiState
                    && State.CONNECTED == mMobileState) {
                // 手機網路連線成功
            } else if (mWifiState != null && mMobileState != null && State.CONNECTED != mWifiState && State.CONNECTED != mMobileState) {
                mHandler.sendEmptyMessage(MSG_SHOW_NET_DIALOG);
            } else if (mWifiState != null && State.CONNECTED == mWifiState) {
                // 無線網路連線成功
                
            }


九十九、ImageView的ScaleType屬性

ImageView.ScaleType|android:scaleType值的意義:

ImageView.ScaleType.CENTER|android:scaleType="center" 按圖片的原來size居中顯示,當圖片長/寬超過View的長/寬,則擷取圖片的居中部分顯示

ImageView.ScaleType.CENTER_CROP|android:scaleType="centerCrop" 按比例擴大圖片的size居中顯示,使得圖片長 (寬)等於或大於View的長(寬)

ImageView.ScaleType.CENTER_INSIDE|android:scaleType="centerInside" 將圖片的內容完整居中顯示,通過按比例縮小或原來的size使得圖片長(寬)等於或小於View的長(寬)

ImageView.ScaleType.FIT_CENTER|android:scaleType="fitCenter" 把圖片按比例擴大(縮小)到View的寬度,居中顯示

ImageView.ScaleType.FIT_END|android:scaleType="fitEnd" 把圖片按比例擴大(縮小)到View的寬度,顯示在View的下部分位置

ImageView.ScaleType.FIT_START|android:scaleType="fitStart" 把圖片按比例擴大(縮小)到View的寬度,顯示在View的上部分位置

ImageView.ScaleType.FIT_XY|android:scaleType="fitXY" 把圖片按照指定的大小在View中顯示

ImageView.ScaleType.MATRIX|android:scaleType="matrix" 用matrix來繪製


一百、垂直進度條

  1. @Override  
  2.     protected synchronized void onDraw(Canvas canvas)  
  3.     {  
  4.         // TODO Auto-generated method stub  
  5.         canvas.rotate(-90);//反轉90度,將水平ProgressBar豎起來  
  6.         canvas.translate(-getHeight(), 0);//將經過旋轉後得到的VerticalProgressBar移到正確的位置,注意經旋轉<span style="white-space:pre">                     </span>    後寬高值互換  
  7.         super.onDraw(canvas);  
  8.     }

一零一、android獲取本機Ip地址


public String getLocalIpAddress() {  
        try {  
            for (Enumeration<NetworkInterface> en = NetworkInterface  
                    .getNetworkInterfaces(); en.hasMoreElements();) {  
                NetworkInterface intf = en.nextElement();  
                for (Enumeration<InetAddress> enumIpAddr = intf  
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
                    InetAddress inetAddress = enumIpAddr.nextElement();  
                    if (!inetAddress.isLoopbackAddress()) {  
                        return inetAddress.getHostAddress().toString();  
                    }  
                }  
            }  
        } catch (SocketException ex) {  
            Log.e("WifiPreference IpAddress", ex.toString());  
        }  
        return null;  
    }  

別忘了加許可權:

  1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  2. <uses-permission android:name="android.permission.INTERNET"></uses-permission>  


有時候,有的手機會有ip6地址,所以在if()判斷裡面,最好這樣寫:

if (!inetAddress.isLoopbackAddress()&& InetAddressUtils
                    		.isIPv4Address(inetAddress
                    		.getHostAddress().toString())) { 

一零二、開機啟動

            原理就是啟動一個BroadcastReceiver來監聽系統發出的開機廣播:Android.intent.action.BOOT_COMPLETED

public class StartupReceiver extends BroadcastReceiver {


	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
                //xxx 你要跳轉到的activity		
                Intent i = new Intent(context,xxx.class);
		i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		//將intent以startActivity傳送給作業系統
		context.startActivity(i);


	}


}

後面 在manifest裡面註冊BroadcastReceiver

<receiver android:name=".StartupReceiver">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />  
                <category android:name="android.intent.category.HOME" />  
            </intent-filter>  
        </receiver> 

最後,再新增上許可權就可以了


<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

一零三、Java物件賦值注意點

        剛剛再看Think in Java 4的時候,提醒下自己!

      對主資料型別的賦值是非常直接的。由於主型別容納了實際的值,而且並非指向一個物件的控制程式碼,所以在為其賦值的時候,可將來自一個地方的內容複製到另一個地方。例如,假設為主型別使用“A=B”,那麼B處的內容就複製到A。若接著又修改了 A,那麼 B 根本不會受這種修改的影響。作為一名程式設計師,這應成為自己的常識。 
       但在為物件“賦值”的時候,情況卻發生了變化。對一個物件進行操作時,我們真正操作的是它的控制程式碼。所以倘若“從一個物件到另一個物件”賦值,實際就是將控制程式碼從一個地方複製到另一個地方。這意味著假若為物件使用“C=D”,那麼C 和D最終都會指向最初只有 D 才指向的那個物件。下面這個例子將向大家闡示這一點。 

把書中的例子稍微修改了下:

package cn.demo;
class Number { 
  int i; 
} 
 
public class Assignment { 
  public static void main(String[] args) { 
    Number n1 = new Number(); 
    Number n2 = new Number(); 
    n1.i = 9; 
    n2.i = 47; 
    System.out.println("1: n1.i: " + n1.i + 
      ", n2.i: " + n2.i); 

    n1.i = n2.i;
    System.out.println("2: n1.i: " + n1.i + 
    	      ", n2.i: " + n2.i); 
    n1.i = 32;
    System.out.println("3: n1.i: " + n1.i + 
    	      ", n2.i: " + n2.i); 
    n1 = n2; 
    System.out.println("4: n1.i: " + n1.i + 
      ", n2.i: " + n2.i); 
    n1.i = 27; 
    System.out.println("5: n1.i: " + n1.i + 
      ", n2.i: " + n2.i); 
  } 
}

列印結果:

 1: n1.i: 9, n2.i: 47
2: n1.i: 47, n2.i: 47
3: n1.i: 32, n2.i: 47
4: n1.i: 47, n2.i: 47
5: n1.i: 27, n2.i: 27

 

一零四、Notification點選取消

notification.flags |= Notification.FLAG_AUTO_CANCEL;


一零五、保留表結構,刪除表中所有內容

"DELETE FROM " + TABLE_NAME + " WHERE 1 = 1"

一零六、Android手機獲取手機唯一識別號


在開發手機應用時,開發者最關心的是開發的手機軟體有多少使用者安裝,並且正在使用。這就需要識別手機的唯一性。目前我瞭解的有兩種方法,獲取手機的imei號(imei號是唯一識別手機的號碼)。獲取android id號(android id 是手機系統的唯一號碼)。

  第一種方法:

  android獲取手機imei號的方法在在android系統中獲取imei號和其他手機資訊一文中做了詳細的介紹。其中android在 2.0以上的版本中,獲取手機imei號已經不需要相應的讀取手機資訊的許可權了。

  < uses-permission android:name="android.permission.READ_PHONE_STATE" />

  但是目前1.6以下的版本使用者佔使用者的近50%,如果想要讓1.6以下版本的使用者也可以獲取imei號,那就要新增許可權。

  好處是唯一標識手機,缺點是可能需要相應的使用者許可權。


String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);

String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);

  第二種方法:

  可以獲取android id號,如果一個手機裝置第一次啟動隨即產生的一個數字,如果系統改變,該號可能會改變。

  android id號解釋:http://androidappdocs-staging.appspot.com/reference/android /provider/Settings.Secure.html#ANDROID_ID

  獲取方法:

  String t=android.provider.Settings.System.getString(getContentResolver(), "android_id");

  Log.i("huilurry","android_id="+t);

  Ms測試結果:

  07-13 13:12:49.835: INFO/huilurry(17455): android_id=20014289e714f20c

  好處是所有版本都試用,缺點是可能會和其他機子重複或本機改變。via:http://wangjun.easymorse.com /?p=665

3、獲取IMEI是把,telephonypackage的TelephonyManager類的getDeviceId() 方法


獲得IMSI / IMEI(SIM和手機的唯一識別ID)

  學習內容: 你將學到如何讀出你手機裡的SIM卡的IMSI (國際移動使用者ID) 和IMEI (國際移動裝置ID). IMSI 與 SIM唯一對應, IMEI 與 裝置唯一對應.

  可能應用的場合: 你可能需要 唯一的id 去授權/註冊,或者用於你的Android-Activity的license目的 下面的兩行程式碼將會使你獲得SIM卡唯一 ID IMSI 和裝置唯一ID IMEI

  描述:
  IMSI是一個 唯一的數字, 標識了GSM和UMTS 網路裡的唯一一個使用者. 它 儲存 在手機的SIM卡里,它會通過手機傳送到網路上.

  IMEI也是一串唯一的數字, 標識了 GSM 和 UMTS網路裡的唯一一個手機. 它通常被列印在手機裡電池下面的那一面,撥  *#06# 也能看到它.

  程式碼: 這裡是你在Android裡讀出 唯一的 IMSI-ID / IMEI-ID 的方法。
Java: 
         String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);

         String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);


一零七、 靜默解除安裝系統軟體和第三方軟體

一個個解除安裝軟體,彈出解除安裝軟體提示好麻煩,現在特作出下列方法,可以靜默解除安裝

靜默安裝敬請期待。。。。



          //下面3句是靜默解除安裝系統軟體命令
            String busybox="mount -o remount rw /system";
         String chmod="chmod 777 /system/app/HtcTwitter.apk";
         uninstallapk="rm -r /system/app/HtcTwitter.apk";
         
         //下面3句是靜默解除安裝第三方軟體命令
         String busybox1="mount -o remount rw /data";
         String chmod1="chmod 777 /data/app/com.yingyonghui.market-2.apk";
         uninstallapk1="pm uninstall com.yingyonghui.market";
         
         chmodApk(busybox1,chmod1);







  /*
     * 對要解除安裝的apk賦予許可權
     */
    public void chmodApk(String busybox ,String chmod)
    {
     try {
     
       Process process = null;
   DataOutputStream os = null;

   process = Runtime.getRuntime().exec("su");
   os = new DataOutputStream(process.getOutputStream());
   os.writeBytes(busybox);
        os.flush();
        
        os.writeBytes(chmod);
        os.flush();
        
        os.close();
       } catch (Exception ex) {
           ex.printStackTrace();
       }
    }
    
    
    /*
     * 解除安裝apk
     */
    public void uninstallApk(String uninstallapk)
    {
     try {
         
       Process process = null;
   DataOutputStream os = null;
   process = Runtime.getRuntime().exec("su");
   os = new DataOutputStream(process.getOutputStream());
        os.writeBytes(uninstallapk);
        os.flush();
        
        os.close();
       } catch (Exception ex) {
           ex.printStackTrace();
       }
    }


一零八、獲取當前顯示的activity

用ActivityManager裡面可以獲取到當前執行的所有任務,所有程式和所有服務,這是工作管理員的核心。 
         仔細看getRunningTasks的文件,裡面說獲取的是系統中"running"的所有task,"running"狀態包括已經被系統凍結的task。而且返回的這個列表是按照順序排列的,也就是說第一個肯定比第二個後執行。 
          getRunningTasks有個整型引數,表示返回列表的最大個數。那麼,我們如果把1作為引數給進去,那麼他返回的task就是當前執行的那個task,然後從task中獲取到最頂層的activity,這個activity就是當前顯示給使用者的那個activity了。


ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
Log.d("", "pkg:"+cn.getPackageName());
Log.d("", "cls:"+cn.getClassName());


一零九、android程式碼實現ViewPager的indictor效果


一一零、Android 手繪 - 支援儲存為圖片 


一一一、android 遮罩層效果


一一二、 Android中從SD卡中/拍照選擇圖片並進行剪裁的方法



/**
    * 實現文字複製功能
    * @param content 要複製的內容
    */  
public static void copy(String content, Context context) {
// 得到剪貼簿管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim());
}


一一四、 給圖片加水印
try {
ImageView img=(ImageView) findViewById(R.id.test_img_file);
//獲取從本地獲取的檔案路徑,用FileInputstream讀入檔案,並將圖片檔案轉換成點陣圖
Bundle bundle=getIntent().getExtras();
String path=bundle.getString("test");
FileInputStream fa=new FileInputStream(path);
Bitmap bm=BitmapFactory.decodeStream(fa);//原圖
Bitmap wm=BitmapFactory.decodeResource(getResources(), R.drawable.wate_market);//水印
//將creatBitmap()方法的返回值(返回點陣圖)放到圖片控制元件顯示
img.setImageBitmap(createBitMap(bm,wm));
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private Bitmap createBitMap(Bitmap src,Bitmap wmsrc){
/**
* 水印製作方法
*/
String tag="xx";
Log.d(tag, "開始了,畫圖");
if(src==null){
return null;
}
int w=src.getWidth();
int h=src.getHeight();
int wmw=wmsrc.getWidth();
int wmh=wmsrc.getHeight();
//create the new bitmap
Bitmap newb=Bitmap.createBitmap(w,h,Config.ARGB_8888);//建立一個底圖
Canvas cv=new Canvas(newb);
//將底圖畫進去
cv.drawBitmap(src, 0, 0,null);//在0,0座標開始畫入src
//講水印畫進去
cv.drawBitmap(wmsrc, w-wmw+5, h-wmh+5, null);
//儲存圖片
cv.save(Canvas.ALL_SAVE_FLAG);
cv.restore();
return newb;

}
}


一一五、DialogFragment設定透明

在onCreatview裡面加上:
getDialog().getWindow().setBackgroundDrawable(new

ColorDrawable(Color.TRANSPARENT));




相關文章