テスト機(エミュレーター)では問題なく動くのに、スマホ携帯(N-04d、Android2.3)にアップして実行したら、エラー出現。。現象は、「トークンは取得できているのにその先のカレンダー情報やタスク情報がとってこれていない」ということでした。
ということで、Google API(TasksやCalendar)に関する報告です。
AuthTokenでトークンを取得し、Tasksからタスクリストを取得しようとしたら、、、
なんと!401エラーが帰ってきました。。
その理由はというと、GoogleAPIのバグだそうです。。
参考記事
そのエラーの回避方法は、「古いトークンを廃棄する」ことだそうです。実際、それでOKでした。
具体的には、
・発行されたtokenを変数に格納しておく(すぐに捨てない)
・201エラーが出たら、そのトークンを捨てる
・再度トークンを取得すれば、そのトークンでTasksなど取得可能となる
トークンを捨てるのは、
mAccountManager.invalidateAuthToken(acc.type, currentToken); //acc:Account型,currentToken:String型
です。
まだきっちりロジック組めてないですが、とりあえずのアップでした。
テーマ:Android - ジャンル:携帯電話・PHS
- 2012/05/03(木) 01:51:54|
- Android
-
| トラックバック:0
-
| コメント:0
単にDate型・日付型の数値を文字列に変換したいだけだったが、結構ヒットしないもの。。
Calendar型を使えという記事は多かったが、なんとなく感じが悪いし。
VBでは、formatという関数と同じような挙動をしてくれればOKなんだが。
ということで、自分用まとめ。
ちなみに、エミュレーターのタイムゾーンに影響した時間が表示されます。
・うちのは地域がUSに設定されている模様で、実際の時間-9時間
・携帯にDLして実行したら、日本の今の時間を表示しれくれました。
ソースコード
Date date = new Date(); //VBのnowと一緒
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Log.d("Test", simpleDateFormat.format(date));
★ 注意点! ★
Date部分に赤波線が出てきて、マウスを近づけて「Import #Library」をするとき、間違えて“SQL”用のをインポートしないように!!
テーマ:プログラミング - ジャンル:コンピュータ
- 2012/04/30(月) 21:20:29|
- Android
-
| トラックバック:0
-
| コメント:0
サブ画面を呼び出すためのサンプルです。
Intentを利用します。
詳細はたくさんインターネットに出ていると思うので、極力シンプルに“明示的インテント”を書きました。
<注意!!>
AndroidManifest.xmlに、サブ画面の登録をしておかないと、こけます。
いっつも忘れてしまうんですが、、、
ちなみに、↓のような感じでマニュフェストに登録します。
<activity
android:name=".SubActivity"
android:label="SubActivity" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
サンプルは、
- サブ画面のリストビューを表示
- クリックしたら、サブ画面を閉じる
- メインアクティビティで、“サブ画面が閉じられた”のを拾って、クリックされたアイテムを表示
といった流れです。
-----------------------------------------------
1.プロジェクトの新規作成
-----------------------------------------------
Eclipseで、プロジェクトを新規作成します。
ちなみに、私は以下の設定で作りました。
Target Name:Google APIs(Platform=8)
アプリケーション名:TestIntent
パッケージ名:com.fxscore.testintent
Activity名:TestIntentActivity
Minimum SDK:8
-----------------------------------------------
2.サブ画面のクラス作成
-----------------------------------------------
サブ画面のクラスを、Activityから派生させて作ります。
package com.fxscore.testintent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class SubActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_subactivity);
// アダプター設定
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
adapter.add("red");
adapter.add("green");
adapter.add("blue");
ListView lv = (ListView) findViewById(R.id.sublv);
lv.setAdapter(adapter);
// リストビューのアイテムがクリックされた時の挙動
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView lv = (ListView) parent;
String item = lv.getItemAtPosition(position).toString();
Toast.makeText(SubActivity.this, item, Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.putExtra("SUB_INPUT_STRING", item);
setResult(RESULT_OK,intent);
finish();
}
});
}
}
★利用するリソース(レイアウト)★
(ファイル名:layout_subactivity.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/sublv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
-----------------------------------------------
3.メインアクティビティの修正
-----------------------------------------------
メインどころの「TestIntentActivity 」を、以下のように書き換えます。
package com.fxscore.testintent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class TestIntentActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent( TestIntentActivity.this, SubActivity.class );
//リクエストコード123で呼び出し
this.startActivityForResult(intent, 123);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 123){
if (resultCode == RESULT_OK){
Bundle extras = intent.getExtras();
if (extras != null){ Log.d("res",extras.getString("SUB_INPUT_STRING")); }
else { Log.d("res", "extra is null" ); }
} else{
Log.d("aaa","OKじゃない");
}
}
}
}
ちなみに、レイアウトはデフォルトのままでOKです。
-----------------------------------------------
4.マニュフェストの修正
-----------------------------------------------
↓な感じ。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fxscore.testintent"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".TestIntentActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SubActivity"
android:label="SubActivity" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
以上です。
テーマ:プログラミング - ジャンル:コンピュータ
- 2012/04/30(月) 03:12:09|
- Android
-
| トラックバック:0
-
| コメント:0
ListViewを、xmlのレイアウトを使わずにソースコードに自前で埋め込んで作成する方法です。
そのためには、BaseAdapterクラスを拡張して自前で作成する必要があります。
具体的には以下のとおり。でも、文字サイズとか、きちゃない。。
参考にさせてもらったサイト
-----------------------------------------------
1.プロジェクトの新規作成
-----------------------------------------------
Eclipseで、プロジェクトを新規作成します。
ちなみに、私は以下の設定で作りました。
Target Name:Google APIs(Platform=8)
アプリケーション名:TestListViewNoXML
パッケージ名:com.fxscore.testlistviewnoxml
Activity名:TestListViewNoXMLActivity
Minimum SDK:8
-----------------------------------------------
2.プログラム
-----------------------------------------------
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class TestListViewNoXMLActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// レイアウトをコーディングで作成
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
setContentView(linearLayout);
// ListViewを作成
ListView lv = new ListView(this);
String teststr[] = {"str1","str2","str3"};
lv.setAdapter(new TestAdapter(this, teststr));
// ListViewをレイアウトにセット
linearLayout.addView(lv);
// リストビューのアイテムがクリックされた時の挙動
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView lv = (ListView) parent;
String item = (String) lv.getItemAtPosition(position);
Toast.makeText(TestListViewNoXMLActivity.this, item, Toast.LENGTH_SHORT).show();
}
});
}
// BaseAdapterクラスを拡張して自前で作成
private class TestAdapter extends BaseAdapter{
private Context con;
private String[] data ;
// コンストラクタ
public TestAdapter(Context context, String[] str) {
con = context;
data = str ;
}
// 必要関数
public int getCount() {return data.length;}
public Object getItem(int position) {return data[position];}
public long getItemId(int position) {return position;}
// Listの中身を生成
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if(convertView == null){ tv = new TextView(con) ; }
else { tv = (TextView)convertView; }
tv.setText(data[position]);
tv.setTextSize(30) ; //文字サイズをここで調整
return tv;
}
}
}
テーマ:プログラミング - ジャンル:コンピュータ
- 2012/04/30(月) 02:56:48|
- Android
-
| トラックバック:0
-
| コメント:0