0%

调用系统的拍照程序进行拍照,Intent参数MediaStore.EXTRA_OUTPUT的值是一个URI,指向保存的文件路径,CAMERA_WITH_DATA是拍照成功后的返回值。

                File f = new File(picPath);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        startActivityForResult(intent, CAMERA_WITH_DATA);

返回后,在onActivityResult中处理:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        switch (requestCode) {
        case CAMERA_WITH_DATA:
            System.out.println("拍照成功");
            break;
        }
    }

有时候,我们的SQL语句可能会比较复杂,用DAO的query方法可能不能满足需要,就需要调用queryRaw方法来查询原生的SQL语句。 下例中,ShortMessage是Mode类

    try {
            GenericRawResults results = messageDao
                    .queryRaw(
                            "select id,_to,_from,message,MAX(date),username,_type,read from message group by username order by date desc;",
                            new RawRowMapper() {
                                @Override
                                public ShortMessage mapRow(
                                        String[] columnNames,
                                        String[] resultColumns)
                                        throws SQLException {
                                    // TODO Auto-generated method stub
                                    ShortMessage message = new ShortMessage();
                                    message.setId(Integer
                                            .parseInt(resultColumns[0]));
                                    message.setTo(resultColumns[1]);
                                    message.setFrom(resultColumns[2]);
                                    message.setMessage(resultColumns[3]);
                                    String dateStr = resultColumns[4];// 存储格式为2012-12-05
                                                                        // 14:46:23.000927
                                    SimpleDateFormat sdf = new SimpleDateFormat(
                                            "yyyy-MM-dd HH:mm:ss");
                                    try {
                                        message.setDate(sdf.parse(dateStr));
                                    } catch (ParseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    message.setUsername(resultColumns[5]);
                                    message.setType(Integer
                                            .parseInt(resultColumns[6]));
                                    int readed = Integer
                                            .parseInt(resultColumns[7]);
                                    if (readed == 0) {
                                        message.setRead(false);
                                    } else {
                                        message.setRead(true);
                                    }
                                    return message;
                                }
                            });

            Iterator iterator = results.iterator();
            List messageList = new ArrayList();
            while (iterator.hasNext()) {
                ShortMessage message = iterator.next();
                messageList.add(message);
            }

Dialog类有一个成员变量mShowing用来判断是否可以关闭对话框,mShowing为true表示窗口正打开,可以关闭,mShowing为false表示窗口没显示,不可关闭,我们强制把mShowing设为false,即可达到禁止关闭Dialog的目标,在需要关闭的时候,手动设置为true.

        AlertDialog noticeDialog=new AlertDialog.Builder(context).create();
        noticeDialog.show();
        Window window = noticeDialog.getWindow();
        window.setContentView(R.layout.dialog_notice);
        TextView notice_text = (TextView)window.findViewById(R.id.notice_text);
        notice_text.setText(noticeText);
        //利用反射,把mShowing设为true
        try {
            Field field = noticeDialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(noticeDialog, false);
        } catch (Exception e) {
            e.printStackTrace();
        }

默认,AIDL支持对象作参数,但需要该对象实现Parcelable接口,且aidl文件应该是该类在同一包下,需要单独给该类定义一个aidl文件. 定义模型类: EnglishItem.java:

package com.pocketdigi.english.aidl;

import android.os.Parcel;
import android.os.Parcelable;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import com.pocketdigi.english.utils.Constants;
import com.pocketdigi.english.utils.Des;

@DatabaseTable(tableName = "listenlist")
public class EnglishItem implements Parcelable {
    /**
     * 
     */
    private static final long serialVersionUID = -1756522544697525757L;
    @DatabaseField(id = true)
    private int id;
    @DatabaseField
    private String title;
    @DatabaseField
    private String category;
    @DatabaseField
    private String mp3url;
    @DatabaseField
    private String lrcurl;
    @DatabaseField
    private String txturl;

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public EnglishItem createFromParcel(Parcel in) {
            return new EnglishItem(in);
        }

        public EnglishItem[] newArray(int size) {
            return new EnglishItem[size];
        }
    };
    
    private EnglishItem(Parcel in)
    {
        readFromParcel(in);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getMp3url() {
        return Des.decodeValue(Constants.DES_KEY, mp3url);
    }

    public void setMp3url(String mp3url) {
        this.mp3url = mp3url;
    }

    public String getLrcurl() {
        return Des.decodeValue(Constants.DES_KEY, lrcurl);
    }

    public void setLrcurl(String lrcurl) {
        this.lrcurl = lrcurl;
    }

    public String getTxturl() {
        return Des.decodeValue(Constants.DES_KEY, txturl);
    }

    public void setTxturl(String txturl) {
        this.txturl = txturl;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flag) {
        // TODO Auto-generated method stub
        out.writeInt(id);
        out.writeString(title);
        out.writeString(category);
        out.writeString(mp3url);
        out.writeString(lrcurl);
        out.writeString(txturl);
    }
    /**
     * 读
     * @param in
     */
    public void readFromParcel(Parcel in)
    {
        id=in.readInt();
        title=in.readString();
        category=in.readString();
        category=in.readString();
        lrcurl=in.readString();
        txturl=in.readString();
    }
}

Parcelable.Creator不可少。 同包下定义一个EnglishItem.aidl:

package com.pocketdigi.english.aidl;
parcelable EnglishItem;

最后是调用接口aidl: PlayerAidl.aidl:

package com.pocketdigi.english.aidl;

import com.pocketdigi.english.aidl.EnglishItem;

interface PlayerAidl {
    /**
    *传入列表
    **/
    void putList(inout List item);
    /**
    *播放指定音频
    **/
    void play(int index);
    void pause();
    /**
    *暂停后恢复播放
    **/
    void resume();
    /**
    *删除指定项
    **/
    void delete(int position);
    /**
    *停止服务
    **/
    void stopService();
}

PopupWindow里显示listview 解决ListView取不到ItemClick事件问题

package com.example.popupwindow;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupWindow;

public class MainActivity extends Activity {
    Button button1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1=(Button)findViewById(R.id.button1);
        
        button1.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
                //生成ListView
                ListView listview=new ListView(MainActivity.this);
                String[] strs=new String[3];
                strs[0]="asfsafdasdf";
                strs[1]="桂 地要仍地沃尔夫仍";
                strs[2]="asfsafdasdf";
                ArrayAdapter adapter=new ArrayAdapter(MainActivity.this,R.layout.item,R.id.text1,strs);
                listview.setAdapter(adapter);
                listview.setOnItemClickListener(new OnItemClickListener() {

                    public void onItemClick(AdapterView parent, View view, int position, long id) {
                        // TODO Auto-generated method stub
                        System.out.println(position);
                    }
                });
                
                PopupWindow window=new PopupWindow(MainActivity.this);
                //设置宽高
                window.setWidth(200);
                window.setHeight(120);
                //填充
                window.setContentView(listview);
                //外部可部
                window.setOutsideTouchable(true);
                //加了下面这行,onItemClick才好用
                window.setFocusable(true);
                window.showAsDropDown(button1);

            }});
        
    }

}

先自定义一个继承自Application的类:

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

public class MyApplication extends Application {
    private List  activitys;
    //在Activity的OnCreate方法中调用,添加Activity实例
    public void addActivity(Activity act) {
        if(activitys==null)
        {
            activitys = new ArrayList();
        }
        activitys.add(act);  
    }
    //退出程序时调用,调用所有Activity的finish方法
    public void finishAll() {  
        for (Activity act : activitys) {  
            if (!act.isFinishing()) {  
                act.finish();  
            }  
        }  
        activitys = null;  
    }  
}

修改AndroidManifest.xml中Application标签,设置android:name为我们自定义的MyApplication

在每个Activity的OnCreate方法里把当前的Activity实例添加到Application里的列表中:

MyApplication application = (MyApplication) this.getApplication();
application.addActivity(this);

退出整个程序:

MyApplication application = (MyApplication) this.getApplication();
application.finishAll();

Fragment是3.0以上版本的新特性,如果需要在低版本的Android上使用,要导入Google提供的android-support-v4.jar包. 但在导入后,使用方法与3.0以是版本自带的Fragment稍有不同. 首先,所有的Fragment的类,必须使用android.support.v4.app下的类,不能用android.app中的类。 Activity必须继承自FragmentActivity,获取FragmentManager对象使用getSupportFragmentManager()方法,而不是getFragmentManager()方法.

Http可以使用Key-Value键值对传送参数,也可以发送xml流。 下面是在Android中使用HttpClient提交的方法,Android中的HttpClient与Apache官方的HttpClient略有不同.

    public static String post(String fullUrl, String xml) throws IOException {
        String html = null;
        HttpPost post = new HttpPost(fullUrl);
        DefaultHttpClient httpclient = new DefaultHttpClient();

        StringEntity se=new StringEntity(xml,HTTP.UTF_8);
        try {
            post.setEntity(se);
            HttpResponse response = httpclient.execute(post);
            if (response.getStatusLine().getStatusCode() == 200) {// 如果状态码为200,就是正常返回
                html = EntityUtils.toString(response.getEntity(),"UTF-8");
                // 得到返回的字符串
                System.out.println(html);
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        return html;
    }

不要使用已废弃的public static String encode(String s)方法,该方法不能指定字符编码,操作系统不同,可能产生乱码. 换成public static String encode(String s,String enc)throws UnsupportedEncodingException,后面一个参数是编码。

Android在拨打电话时会发送一个Action为android.intent.action.NEW_OUTGOING_CALL的广播,系统拨号器收到广播后启动执行拨号操作,所以,要拦截拨号动作,只需要拦截这个广播,并阻止其继续传播,即可。 写个BroadCast,在AndroidManifest.xml中注册:

        <receiver android:name=".CallReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

android:priority为设置广播接收器的优先级。系统的拨号器是1 在BroadcastReceiver中,可以使用clearAbortBroadcast()方法阻止广播继续传播。