lacolaco
8/18/2013 - 1:07 PM

Androidに定時アイコン変更を自動的にさせるプログラム

Androidに定時アイコン変更を自動的にさせるプログラム

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;


public class Uploader
{
    
	final static String consumerKey = "lacolaco";
	final static String consumerSecret = "lacolaco";
	final static String accessToken = "lacolaco";
	final static String accessTokenSecret = "lacolaco";	
	final static String iconUrlBase = "http://dl.dropboxusercontent.com/u/27437828/icons/";
		
	String iconName;
	
	public Uploader(String iconName)
	{
        	//"01.png"みたいなのが渡される
		this.iconName = iconName;
	}
	
	public boolean upload()
	{
        	//説明めんどうだから読んで
		InputStream is = null;
		try
		{
			URL url = new URL(iconUrlBase + iconName);
			URLConnection conn = url.openConnection();
			is = conn.getInputStream();
			
			Twitter twitter = TwitterFactory.getSingleton();
			twitter.setOAuthConsumer(consumerKey, consumerSecret);
			twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));
			twitter.updateProfileImage(is);
			twitter.updateStatus("@laco0416 アイコンを変更します #IconRotation");
			is.close();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			try
			{
				is.close();
			} 
			catch (IOException eio)
			{
				e.printStackTrace();
			}
			return false;
		}
	}
}
import java.util.Calendar;
import java.util.Date;

import android.app.IntentService;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.Preference;
import android.preference.PreferenceManager;
import android.util.Log;

//定期的に実行されるService実体
public class MyService extends IntentService
{
    	
	public MyService()
	{
		super("IconRotate");
	}

	@Override
	public void onDestroy()
	{
		super.onDestroy();
	}

	//起動されたら呼ばれる部分
	@Override
	protected void onHandleIntent(Intent intent)
	{
		Log.i("IconRotation", "CHECKING...");
		SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
		int lastIcon = pref.getInt("lastIcon", -1);
		int currentIcon = getIconNum();
		if(lastIcon == -1 || lastIcon != currentIcon)
		{
            	//今の時間のアイコンと現在使ってるアイコンが違ったら変更
            	//アイコンファイルの名前を生成
            	String name = String.format("%02d.png", currentIcon);
            	//Uploaderにアイコンアップロードを移譲
			if(new Uploader(name).upload())
			{
				pref.edit().putInt("lastIcon", currentIcon).commit();
			}
		}
	}
		
    	//現在の時間から使用するアイコンのナンバーを返す
	int getIconNum()
	{
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		if(hour >= 18 || hour <= 6)
		{
			return 3; //night
		}
		else if(hour >= 10)
		{
			return 2; //noon-afternoon
		}
		else
		{
			return 1; //morning
		}
	}
	
}
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener
{
    
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
        	//View部分なのでロジックに関係なし
        	View start = findViewById(R.id.btn_start);
		View stop = findViewById(R.id.btn_stop);
		start.setOnClickListener(this);
		stop.setOnClickListener(this);

	}


	@Override
	public void onClick(View v)
	{
        	//Serviceの起動準備
		Context context = getBaseContext();
	    	Intent intent = new Intent(context, MyService.class);
	        //AndroidOSのアラームマネージャに定期的なサービスの実行を移譲
	        //常時起動ではなく、OSがその時間にService起動のIntentを飛ばしてくれる
	        PendingIntent pendingIntent = PendingIntent.getService(context, -1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
        	//ボタン処理
		if(v.getId() == R.id.btn_start)
		{			
		        //1000ms後に1時間おきのアラームを始動
		        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 1*1000, AlarmManager.INTERVAL_HOUR, pendingIntent);
		}
		else if(v.getId() ==R.id.btn_stop)
		{
            		//アラーム移譲の停止
		    	alarmManager.cancel(pendingIntent);
		}
	}
}