1.导入demo 工程后,工程报错。控制台的错误信息:Unable to resolve target 'android-4'。
问题原因:sdk版本不符,文件内所写的版本过低
解决办法:修改工程目录下的project.properties文件里的内容target=android-4数字改成你机器里装过的android SDK版本就可以了。
另外还有修改AndroidManifest.xml里的android:minSdkVersion="4"
2.将demo工程导入Eclipse后,按开发手册所言将weibo.sdk.android.sso.jar放在libs下,启动工程时报错如下
Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
问题原因:导入的jar包是双份sdk高版本出现这个问题。官方Demo不用导入weibo.sdk.android.sso.jar这个包。
在工程weibo.sdk.android.sso.demo中已经包含了weibo.sdk.android.sso.jar的源代码。
解决办法:删掉libs下的weibo.sdk.android.sso.jar文件
3.导入工程后,中文乱码
问题原因:默认编码格式与文件格式不符
解决办法:在工程文件夹上右键选择Properties,然后再Resources下的text file encoding选择other->UTF-8
4.导入工程后AndroidManifest.xml文件里报错, <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
问题原因:我不知道
解决办法:project->clean。若以后还出现这个问题,则再clean
5.运行工程后,进行认证过程中程序崩溃
问题原因之一:demo里有个apiBtn 代码多余 一共两处 注释掉就好了
解决办法:注释掉就好了 //apiBtn.setVisibility(View.VISIBLE);
来自:http://www.cnblogs.com/orange-tree/archive/2013/03/13/2958211.html
本文主要使用contentprovider实现读取写入联系人数据,初步学习contentprovider的用法,摘自李刚的《疯狂android》
contentprovider是不同应用程序之间进行数据交换的标准API,contentprovider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用contentresolver根据Uri去访问操作指定数据。
如果把contentprovider当成一个“网站”来看,那木如何完整开发一个contentprovider呢?步骤很简单:
1.定义自己的contentprovider类,该类需要继承android提供的contentprovider基类。
2.想android系统注册这个“网站”,也就是早androidmanifest.xml文件中注册这个contentprovider,就像注册activity一样,注册contentprovider时需要为它绑定一个域名。
android系统提供了contacts应用程序来管理联系人,而且android系统还为联系人管理提供contentprovider,这就允许其他应用程序以contentprovider来管理联系人数据。
android系统对联系人管理contentprovider的几个Uri如下
ContactsContract.Contract.CONTENT_Uri:管理联系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话的Uri.
ContactsContract.CommonDataKinds.Email.Content_URI: 管理联系人的E-mail的Uri
知道联系人管理contentprovider的Uri之后,接下来就可在应用程序中通过contentresolver去操作系统的联系人数据了。
下面示例程序中包含两个按钮,一个按钮用于查询系统的联系人数据,一个按钮用于添加插入联系数据,具体代码如下:
1. main布局文件,由于测试学习使用,没有具体设计布局样式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/querybtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="query"/> <Button android:id="@+id/addbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="add"/> <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text"/> <EditText android:id="@+id/phone" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone"/> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress"/> </LinearLayout>
2.result布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ExpandableListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
3.实现代码如下:
import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Contacts.Data; import android.provider.ContactsContract.RawContacts; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private Button querybtn, addbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); querybtn = (Button)findViewById(R.id.querybtn); addbtn = (Button)findViewById(R.id.addbtn); querybtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //定义两个LIST来封装系统的联系人信息、指定联系人的电话号码,email等详情 final ArrayList<String> names = new ArrayList<String>(); final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>(); //使用contentresolver查找联系人的数据 Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while(cursor.moveToNext()){ //获取联系人ID String contactId = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); names.add(name); //使用contentresolver查找联系人的电话号码 Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null); ArrayList<String> detail = new ArrayList<String>(); //遍历查询结果,获取该联系人的多个电话号码 while(phones.moveToNext()){ String phoneNumber = phones.getString(phones. getColumnIndex(ContactsContract. CommonDataKinds.Phone.NUMBER)); detail.add("电话号码:" + phoneNumber); } phones.close(); //使用contentresolver查找联系人的email的地址 Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null); while(emails.moveToNext()){ String emailAdddress = emails.getString(emails .getColumnIndex(ContactsContract .CommonDataKinds.Email.DATA)); detail.add("邮件地址:" + emailAdddress); } emails.close(); details.add(detail); } cursor.close(); //加载result.xml界面布局代表的视图 View resultDialog = getLayoutInflater().inflate( R.layout.result, null); //获取resultDialog中ID 为list的ExpandableListView ExpandableListView list = (ExpandableListView)resultDialog.findViewById(R.id.list); ExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Override public Object getChild(int groupPosition, int childPosition) { return details.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public int getChildrenCount(int groupPosition) { return details.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return names.get(groupPosition); } @Override public int getGroupCount() { return names.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(names.get(groupPosition).toString()); return textView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private TextView getTextView(){ AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setTextSize(20); return textView; } }; list.setAdapter(adapter); new AlertDialog.Builder(MainActivity.this) .setView(resultDialog) .setPositiveButton("确定", null) .show(); } }); addbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = ((EditText)findViewById(R.id.name)).getText().toString(); String phone = ((EditText)findViewById(R.id.phone)).getText().toString(); String email = ((EditText)findViewById(R.id.email)).getText().toString(); //创建一个空的contentvalues ContentValues values = new ContentValues(); //向rawContacts.Content_URI执行一个空值插入,目的是获取系统返回的rawContactId Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); //设置内容类型 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); //设置联系人的名字 values.put(StructuredName.GIVEN_NAME, name); //向联系人Uri添加联系人名字 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); //设置联系人的电话号码 values.put(Phone.NUMBER, phone); //设置电话类型 values.put(Phone.TYPE, Phone.TYPE_MOBILE); //向联系人电话号码Uri添加电话号码 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); //设置联系人的email地址 values.put(Email.DATA, email); //设置该电子邮件的类型 values.put(Email.TYPE, Email.TYPE_WORK); //向联系人email uri添加email数据 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); Toast.makeText(MainActivity.this, "联系人数据添加成功", Toast.LENGTH_SHORT).show(); } }); } }
上面程序需要读取、添加联系人信息,因此需要在androidmanifest.xml中为该应用程序授权
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
项目代码见附件
Installation:
(出于简单考虑,这里不包含配置apache的环节,因此直接把phabricator安装到apache的/var/www,可参考phabricator docs进行更多配置)
1. 如果sudo不能使用,则先su切换到root,然后安装sudo,apt-get install sudo
2. wget http://www.phabricator.com/rsrc/install/install_ubuntu.sh
cp install_ubuntu.sh /var/www
cd /var/www
chmod +x install_ubuntu.sh
./install_ubuntu.sh
3. vim /etc/apache2/sites-enabled/000-default
把两处:/var/www 改为 /var/www/phabricator/webroot
DocumentRoot /var/www/phabricator/webroot
RewriteEngine on
RewriteRule ^/rsrc/(.*) - [L,QSA]
RewriteRule ^/favicon.ico - [L,QSA]
RewriteRule ^(.*)$ /index.php?__path__=$1 [B,L,QSA]
4. /etc/init.d/apache2 restart
5. cd phabricator
./bin/storage upgrade
完成,可web登录,并开始configuration:
1. ./bin/accountadmin 设置用户
2. ./bin/config set phabricator.base-uri 'http://192.168.15.129/' 设置base uri
3. vim /etc/php5/apache2/php.ini
/timezone找到date.timezone并设置为:date.timezone = Asia/Shanghai
/etc/init.d/apache2 restart
4. 运行daemon:./bin/phd start
5. 配置mail:通过web访问phabricator并在页面上进行配置:(这里使用的是外部SMTP server的方式,更多方式参见phabricator docs)
用administrator账号登录后,在administration栏选择Config进入
1)选择mail,设置:
metamta.default-address -- xxxx@163.com // 注意:这里必须要用与smtp服务器对应的邮箱地址,不然邮件发不出去
metamta.domain -- phabricator.myproject.com // 随意
metamta.mail-adapter: set to "PhabricatorMailImplementationPHPMailerAdapter"
metamta.send-immediately: Send Via Daemons
2)选择PHPMailer,设置:(以163.com的SMTP server为例)
phpmailer.mailer: set to "smtp".
phpmailer.smtp-host: smtp.163.com
phpmailer.smtp-port: 25
phpmailer.smtp-user: xxxx
phpmailer.smtp-password: xxxx
配置完毕后,可以在Administration-MetaMTA下进行发送邮件的测试,注意需要添加一个User组用户,无法直接向System Agent组用户发送邮件
6. 添加代码库:Administration内选择Repositories,点击Create New Repository,可选择Git或SubVersion类型的代码库,Name是库名称,Callsign用于作为所有revision commit的前缀使用,一般用短小的全大写。
创建完毕后,在tracking内配置跟踪参数,填写remote url(代码库地址),配置代码库在服务器上保存的路径local path:比如/home/username/git,然后再根据情况填写用户名,密码一般就可以了。保存后,phabricator后台会自动tracking代码库的更改情况。
至此,phabricator可以基本使用了,其他工具如arcnist等使用及配置可参照phabricator文档,大部分配置都可以直接使用administrator账号在web网页上进行。