随笔杂记

   :: 首页 :: 新随笔 ::  ::  :: 管理 ::

#

# 获取屏幕亮度

public static int getScreenBrightness(Activity activity) {
int value = 0;
ContentResolver cr = activity.getContentResolver();
try {
value = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS);
} catch (SettingNotFoundException e) {

}
return value;
}

# 设置屏幕亮度

public static void setScreenBrightness(Activity activity, int value) {
WindowManager.LayoutParams params = activity.getWindow().getAttributes();
params.screenBrightness = value / 255f;
activity.getWindow().setAttributes(params);
}

posted @ 2012-03-13 14:49 天宇恒星 阅读(5416) | 评论 (1)编辑 收藏

默认的Android的Browser中无法设置User Agent,但是在Browser的源码中可以看到,android提供了4中User Agent 具体代码如下:

在Browser的 src/com/android/browser/BrowserSettings.java 

private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +  
           
"U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, " +  
           
"like Gecko) Version/5.0 Safari/533.16";  
  
   
private static final String IPHONE_USERAGENT = "Mozilla/5.0 (iPhone; U; " +  
           
"CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 " +  
           
"(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7";  
  
   
private static final String IPAD_USERAGENT = "Mozilla/5.0 (iPad; U; " +  
           
"CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 " +  
           
"(KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10";  
  
   
private static final String FROYO_USERAGENT = "Mozilla/5.0 (Linux; U; " +  
           
"Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 " +  
           
"(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";  



提供了4中不同的User Agent,但是在浏览器中无法进行设置。


在Browser的setting中添加设置User Agent的选项:

1.在 res/xml/browser_preferences.xml中添加:

<ListPreference
                
android:key="user_agent"
                android:title
="@string/pref_user_agent"
                android:defaultValue
="0"
                android:entries
="@array/pref_development_ua_choices"
                android:entryValues
="@array/pref_development_ua_values"
                android:dialogTitle
="@string/pref_user_agent_dialogtitle" />


2.在res/value/string.xml中添加对应的字符串,多语言的具体到不同的文件夹(自己添加)

<string name="pref_user_agent">User agent</string>  
  
 
<string name="pref_user_agent_dialogtitle"  translatable="false">User Agent</string>  
<string-array name="pref_development_ua_choices" translatable="false">
        
<item>Android</item>
        
<item>Desktop</item>
        
<item>iPhone</item>
        
<item>iPad</item>
        
<item>Froyo-N1</item>
        
<item>NexusOne</item>
        
<item>Samsung i9000</item>
    
</string-array>
    
<!-- Do not tranlsate.  Development option -->
    
<string-array name="pref_development_ua_values" translatable="false">
        
<item>0</item>
        
<item>1</item>
        
<item>2</item>
        
<item>3</item>
        
<item>4</item>
        
<item>5</item>
        
<item>6</item>
    
</string-array>

3. 在 src/com/android/BrowserSettings.java 中添加

  1. public final static String PREF_USER_AGENT = "user_agent";  

4.在 src/com/android/BroserPreferencesPage.java 中添加
private CharSequence getVisualUserAgent(String enumName) {
        CharSequence result 
= "";
        CharSequence[] visualNames 
= getResources().getTextArray(
                R.array.pref_development_ua_choices);
        CharSequence[] enumNames 
= getResources().getTextArray(R.array.pref_development_ua_values);

        
if (visualNames.length == enumNames.length) {
            
for (int i = 0; i < enumNames.length; i++{
                
if (enumNames[i].equals(enumName)) {
                    result 
= visualNames[i];
                }

            }

        }

        
return result;
    }


5. 在BroserPreferencesPage.java的OnCreate方法中添加

= findPreference(BrowserSettings.PREF_USER_AGENT);  
    e.setOnPreferenceChangeListener(
this);  
    e.setSummary(getVisualUserAgent(  
        getPreferenceScreen().getSharedPreferences()  
        .getString(BrowserSettings.PREF_USER_AGENT, 
null))); 
 
6.在BroserPreferencesPage.java的onPreferenceChange 方法中添加


else if (pref.getKey().equals(BrowserSettings.PREF_USER_AGENT)){  
        pref.setSummary(getVisualUserAgent((String)objValue));  
        
return true;  
    }
  

     
      7.在BrowserSettings.java的syncSharedPreferences方法中添加

userAgent = Integer.parseInt(p.getString(PREF_USER_AGENT, "0"));


 

posted @ 2011-10-18 12:51 天宇恒星 阅读(4038) | 评论 (0)编辑 收藏

if (Log.isLoggable(TAG, Log.DEBUG))  


开日志级别的方法 

第一种 : 

C:\Users\alex>adb shell 
# setprop log.tag.SQLiteQueryBuilder DEBUG 
setprop log.tag.SQLiteQueryBuilder DEBUG 


第二种: 

第二个就在/data/local.prop文件里写'log.tag.<YOUR_LOG_TAG>=<LEVEL>

posted @ 2011-10-08 18:00 天宇恒星 阅读(599) | 评论 (0)编辑 收藏


android操作sim卡联系人信息
http://hi.baidu.com/yangduoliver/blog/item/709fbe019c9dc118738da523.html

Android联系人数据库全解析
http://jasonshieh.iteye.com/blog/793537

Android管理联系人(包含添加,查询,修改和删除;以及不同版本区别)
http://blog.csdn.net/javatiger427/article/details/5969039

Android中读取电话本Contacts联系人的所有电话号信息
http://blog.csdn.net/wufenglong/article/details/5787486

/Files/liuyanbo/联系人总结.pdf

posted @ 2011-09-25 22:45 天宇恒星 阅读(169) | 评论 (0)编辑 收藏


熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。本文深入介绍一下Android消息处理系统原理。

    Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。

    前面提到Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示:

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

这样你的线程就具有了消息处理机制了,在Handler中进行消息处理。

     Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。详细实现请参考ActivityThread.java文件。

     Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。

     Activity、Looper、Handler的关系如下图所示:

     一个Activity中可以创建多个工作线程或者其他的组件,如果这些线程或者组件把他们的消息放入Activity的主线程消息队列,那么该消息就会在主线程中处理了。因为主线程一般负责界面的更新操作,并且Android系统中的weget不是线程安全的,所以这种方式可以很好的实现Android界面更新。在Android系统中这种方式有着广泛的运用。

     那么另外一个线程怎样把消息放入主线程的消息队列呢?答案是通过Handle对象,只要Handler对象以主线程的Looper创建,那么调用Handler的sendMessage等接口,将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler的handleMessage接口来处理消息。

     这里面涉及到线程同步问题,请先参考如下例子来理解Handler对象的线程模型:

1、首先创建MyHandler工程。

2、在MyHandler.java中加入如下的代码:

package com.simon;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.os.Handler;

public class MyHandler extends Activity {
	static final String TAG = "Handler";
	Handler h = new Handler(){
    	public void handleMessage (Message msg)
    	{
    		switch(msg.what)
    		{
    		case HANDLER_TEST:
    			Log.d(TAG, "The handler thread id = " + Thread.currentThread().getId() + "\n");
    			break;
    		}
    	}
    };

	static final int HANDLER_TEST = 1;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "The main thread id = " + Thread.currentThread().getId() + "\n");

        new myThread().start();
        setContentView(R.layout.main);
    }

    class myThread extends Thread
    {
    	public void run()
    	{
    		Message msg = new Message();
    		msg.what = HANDLER_TEST;
    		h.sendMessage(msg);
    		Log.d(TAG, "The worker thread id = " + Thread.currentThread().getId() + "\n");
    	}
    }
}

在这个例子中我们主要是打印,这种处理机制各个模块的所处的线程情况。如下是我的机器运行结果:

09-10 23:40:51.478: DEBUG/Handler(302): The main thread id = 1
09-10 23:40:51.569: DEBUG/Handler(302): The worker thread id = 8
09-10 23:40:52.128: DEBUG/Handler(302): The handler thread id = 1

我们可以看出消息处理是在主线程中处理的,在消息处理函数中可以安全的调用主线程中的任何资源,包括刷新界面。工作线程和主线程运行在不同的线程中,所以必须要注意这两个线程间的竞争关系。

     上例中,你可能注意到在工作线程中访问了主线程handler对象,并在调用handler的对象向消息队列加入了一个消息。这个过程中会不会出现消息队列数据不一致问题呢?答案是handler对象不会出问题,因为handler对象管理的Looper对象是线程安全的,不管是加入消息到消息队列和从队列读出消息都是有同步对象保护的,具体请参考Looper.java文件。上例中没有修改handler对象,所以handler对象不可能会出现数据不一致的问题。

     通过上面的分析,我们可以得出如下结论:

1、如果通过工作线程刷新界面,推荐使用handler对象来实现。

2、注意工作线程和主线程之间的竞争关系。推荐handler对象在主线程中构造完成(并且启动工作线程之后不要再修改之,否则会出现数据不一致),然后在工作线程中可以放心的调用发送消息SendMessage等接口。

3、除了2所述的hanlder对象之外的任何主线程的成员变量如果在工作线程中调用,仔细考虑线程同步问题。如果有必要需要加入同步对象保护该变量。

4、handler对象的handleMessage接口将会在主线程中调用。在这个函数可以放心的调用主线程中任何变量和函数,进而完成更新UI的任务。

5、Android很多API也利用Handler这种线程特性,作为一种回调函数的变种,来通知调用者。这样Android框架就可以在其线程中将消息发送到调用者的线程消息队列之中,不用担心线程同步的问题。

     深入理解Android消息处理机制对于应用程序开发非常重要,也可以让你对线程同步有更加深刻的认识。以上是最近Simon学习Android消息处理机制的一点儿总结,如有错误之处请不吝指教。

posted @ 2011-09-20 14:56 天宇恒星 阅读(322) | 评论 (0)编辑 收藏

之前一直没有搞懂android:padding和android:layout_margin的区别,其实概念很简单,padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离。margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。例如我的XML layout代码如下:
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingLeft="10dip"
    android:paddingRight="10dip"
    android:paddingTop="10dip"
    android:paddingBottom="10dip"
    >
<TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FF0000"
    android:text="@string/hello"
    android:paddingLeft="50dip"
    android:paddingRight="50dip"
    android:paddingTop="50dip"
    android:paddingBottom="50dip"
 android:layout_marginBottom="10dip"
    />
    <TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FF0000"
    android:text="@string/hello"
    android:paddingLeft="50dip"
    android:paddingRight="50dip"
    android:paddingTop="50dip"
    android:paddingBottom="50dip"
  android:layout_marginBottom="10dip"
    />
    <TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FF0000"
    android:text="@string/hello"
    android:paddingLeft="50dip"
    android:paddingRight="50dip"
    android:paddingTop="50dip"
    android:paddingBottom="50dip"
    android:layout_marginBottom="10dip"
    />
    <TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FF0000"
    android:text="@string/hello"
    android:paddingLeft="50dip"
    android:paddingRight="50dip"
    android:paddingTop="50dip"
    android:paddingBottom="50dip"
    android:layout_marginBottom="10dip"
    />
</LinearLayout>

posted @ 2011-09-20 14:51 天宇恒星 阅读(211) | 评论 (0)编辑 收藏

具体代码如下:
LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_STATIC_JAVA_LIBRARIES :
= libarity  
LOCAL_SRC_FILES :
= $(call all-java-files-under, src)  
LOCAL_PACKAGE_NAME :
= TestJar  
include $(BUILD_PACKAGE)  
##################################################  
include $(CLEAR_VARS)  
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :
= libarity:lily.jar  
include $(BUILD_MULTI_PREBUILT)  
# Use the folloing include to make our test apk.  
include $(call all
-makefiles-under,$(LOCAL_PATH))  


关键在于LOCAL_STATIC_JAVA_LIBRARIES := libarity和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:lily.jar

其实libarity是个名字可以随便取,但是两个属性的值要一样就好了,但是后面那个冒号里面就一定要写你的jar包名,你的jar包一定放在工程的根目录就好了,目录结构如下:

-res

-src

-com

-ianc

-testjar

TestJar.java

android.mk

AndroidManifest.xml

default.properties

lily.jar


posted @ 2011-09-20 14:49 天宇恒星 阅读(1413) | 评论 (1)编辑 收藏

字体大小

对于能够显示文字的控件(如TextView EditText RadioButton Button CheckBox Chronometer等等),你有时需要控制字体的大小。Android平台定义了三种字体大小。

"?android:attr/textAppearanceLarge"

"?android:attr/textAppearanceMedium"

"?android:attr/textAppearanceSmall"

使用方法为:

android:textAppearance="?android:attr/textAppearanceLarge" 
android:textAppearance="?android:attr/textAppearanceMedium" 
android:textAppearance="?android:attr/textAppearanceSmall"

style="?android:attr/textAppearanceLarge" 
style="?android:attr/textAppearanceMedium" 
style="?android:attr/textAppearanceSmall"

字体颜色

android:textColor="?android:attr/textColorPrimary" 
android:textColor="?android:attr/textColorSecondary" 
android:textColor="?android:attr/textColorTertiary" 
android:textColor="?android:attr/textColorPrimaryInverse" 
android:textColor="?android:attr/textColorSecondaryInverse"

ProgressBar

style="?android:attr/progressBarStyleHorizontal" 
style="?android:attr/progressBarStyleLarge" 
style="?android:attr/progressBarStyleSmall" 
style="?android:attr/progressBarStyleSmallTitle"

分隔符

横向:

<View android:layout_width="fill_parent" 
      android:layout_height="1dip" 
      android:background="?android:attr/listDivider" />

纵向:

<View android:layout_width="1dip" 
      android:layout_height="fill_parent" 
      android:background="?android:attr/listDivider" />

CheckBox

style="?android:attr/starStyle"

类似标题栏效果的TextView

style="?android:attr/listSeparatorTextViewStyle"

其它有用的样式

android:layout_height="?android:attr/listPreferredItemHeight"

android:paddingRight="?android:attr/scrollbarSize"

style="?android:attr/windowTitleBackgroundStyle"

style="?android:attr/windowTitleStyle"

android:layout_height="?android:attr/windowTitleSize"

android:background="?android:attr/windowBackground"

posted @ 2011-09-20 14:45 天宇恒星 阅读(472) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3