ノンプログラマー・プログラミング・ガイド

ほぼ独学。もはやおっさんになりかかってからプログラミングの勉強開始。HTML、CSS、JavaScript、SQL、PHP、Javaがなんとなく解る。Joomla!とandroidで書いたプログラムを配布中。iPhoneアプリ作りたいからMacくれ(下さい)。

2013年07月

Androidで、一時的に利用するテンポラリー・ファイルをテンポラリー・フォルダーに保存する方法です。なんとなく読んで書いているので、僕はちゃんと理解しているのか怪しいです。

 

一時フォルダーの保存先

2箇所の一時フォルダーが用意されている模様です。
  • 内部フォルダー:軽めのファイル用(1MB未満?)
  • 外部フォルダー:重めのファイル用(1MB以上?)
それぞれの保存先へのパスは、Activity内であれば、下記の方法で呼び出せます。


一時テンポラリーフォルダー
getCacheDir ()

外部テンポラリーフォルダー
getExternalCacheDir ()

Fragmentから呼び出す場合は、getActivity()を呼び出してから、上のメソッドを使えばいいのかと(getActivity().getCacheDir())。



* 外部フォルダーを使う場合は、AndroidManifest.xmlで下記のパーミッションの設定が必要です
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />



一時フォルダーの特徴

1.アプリ毎にフォルダーは生成される(たぶん)
たぶんきっとアプリ毎に一時フォルダーを割り当てているのではないのかと察します。他のアプリのファイルがあるんじゃねーのかとか気にする必要はありません。

2.永続的に保存されてないけど、削除もされない
テンポラリーフォルダーにあるファイルは、その名の通り一時的に利用するためのものなので、永続的にファイルは保存されていません。かといって、Androidさんが自動的にファイルを削除してくれるのかといえば、そうゆう訳でもないみたいです。自分で設定した容量を超えたら自分で削除しろよ見たいな事がかかれてます。


 続きを読む

正直、FacebookのAndroid SDKの使い方として、正解なのか解りません。よく理解してません。


Facebook SDKを通して、僕がやりたい事。 
  • Facebookのログインを通してユーザーデータ(氏名とか)の取得
  • ユーザートークンの取得 
これだけです。トークンは、デバイスから送られたデータの確認のために使用します。現状で考えているデータの流れとして、デバイスで取得したデータをサーバーに送って、そのデータが本当に正しいデータなのかを確認するために、サーバーからFacebookに照会するときに必要なのがトークンです。

ログインボタンの設置

 Facebook SDKに入ってるウィジットを使用します。設置したい場所のxmlファイルに以下を書き加えます。
 
        <com.facebook.widget.LoginButton
		  android:id="@+id/loginButton"		  
		  android:layout_width="wrap_content"
		  android:layout_height="wrap_content"
		/>


リスナーの設置

public class FirstAcessActivity extends FragmentActivity {


	
	private Session.StatusCallback statusCallback = new SessionStatusCallback();
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_first_access);		
		
        
        //set callback
        LoginButton fbLogin = (LoginButton)findViewById(R.id.loginButton);
        fbLogin.setSessionStatusCallback(statusCallback);
	}
    
	
	@Override
    public void onStart() {
        super.onStart();
      
    }

    @Override
    public void onStop() {
        super.onStop();
        //NEED?
        if(Session.getActiveSession()!=null){
        	Session.getActiveSession().removeCallback(statusCallback);
        }
    }
    

    
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    
    
    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(final Session session, SessionState state, Exception exception) {
             
    		if (state.isOpened()) {
    			// Request user data and show the results
    			Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

    				@Override
    				public void onCompleted(GraphUser user, Response response) {
    					if (user != null) {
    						Log.i("token", session.getAccessToken());
    						Log.i("user name", user.getName());
    					} else {
    						
    						//Error
    						
    					}
    				}
    			});

    		} else if (state.isClosed()) {
    			
    			
    		}
        	
        }
    }
}

アクティビティ全体を書いているんですが、肝となるのはこの辺かと。

        //set callback
        LoginButton fbLogin = (LoginButton)findViewById(R.id.loginButton);
        fbLogin.setSessionStatusCallback(statusCallback);

リスナーをxmlで設置したボタンに対して渡してます。


 で、そのリスナーの定義はこんな感じ。
private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(final Session session, SessionState state, Exception exception) {
             
    		if (state.isOpened()) {
    			// Request user data and show the results
    			Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

    				@Override
    				public void onCompleted(GraphUser user, Response response) {
    					if (user != null) {
    						Log.i("token", session.getAccessToken());
    						Log.i("user name", user.getName());
    					} else {
    						
    						//Error
    						
    					}
    				}
    			});

    		} else if (state.isClosed()) {
    			
    			
    		}
        	
        }
Logで書いているんですけど、その辺でユーザー名やらトークンやらが取得できます。

説明が難しいんですけど、作成中のAndroidアプリにアクティビティAがあったとして、そこからアクティビティBを呼び出した場合、通常であれば、ディバイスの「戻る」ボタンを押した時に、アクティビティAへと戻っていくんですけど、このAを呼び出させない方法です。

manifest.xmlの戻るボタンで表示させたくないアクティビティに、
<activity
    android:name="com.test.SampleActivityA"
    android:label="@string/app_name"
    android:noHistory="true" >      
</activity>  
見てお分かりの通り、 noHistory="true"の属性を加えるだけ!



参考:他にもいっぱいあるけど、いまいちよくわかりますん。
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://developer.android.com/guide/topics/manifest/activity-element.html




 

このページのトップヘ