前の10件 2  3  4  5  6  7  8  9  10  11  12

記事一覧

第02回 ループ再生する

前回「第01回 プロジェクト作成と曲再生」作成したものは、1曲を1度だけ再生するものでした。
今回は曲の再生が終わったら、再び再生するようにします。

今後シークバーを追加することも考え、簡単にタイマーを使って実現します。
Windows Media Playerの再生状況はplayStateで参照でき、これがWMPPlayState.wmppsStoppedになっていたら、再度再生するという単純なものです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WMPLib;

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();

		Timer _timer = new Timer();		//追加

		public Form1()
		{
			InitializeComponent();


			//以下を追加
			_timer.Interval = 300;			//300msecごとに処理を実行
			_timer.Tick += delegate
			{
				//止まっていたら再び再生
				if (_mediaPlayer.playState == WMPPlayState.wmppsStopped)
				{
					_mediaPlayer.controls.play();
				}
			};
			_timer.Start();


			_mediaPlayer.settings.volume = 20;
			_mediaPlayer.URL = @"G:\Desktop\mp3\コレサワ - 君のバンド\01 君のバンド.mp3";
			_mediaPlayer.controls.play();
		}
	}
}

プロジェクトファイルをダウンロード

第01回 プロジェクト作成と曲再生

今回はVisual Studio 2012を利用しました。
「ファイルメニュー」の「新規作成」にある「プロジェクトの作成」を選択し、新しいプロジェクトを作成します。

テンプレートは「Visual C#」の「Windows」にある「Windowsフォームアプリケーション」を採用し、プロジェクト名は「MP3Player」としました。

プロジェクトができたらいきなり曲を再生してみます。

再生にはWindows Media Playerのコントロールを利用します。
まずはこのコントロールを利用するために参照の追加作業。
「プロジェクト」メニューにある「参照の追加」を選択し、「参照マネージャー」を開き、ここで「参照」ボタンを押し、「C:\Windows\System32\wmp.dll」を追加します。

wmp.dlの参照を追加したら、次に曲を再生するためのコードを追加します。
ソリューションエクスプローラーから「Form1」を開き、以下のように5行追加します。

追加できたらビルドして実行。これだけで単純に曲が再生できました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WMPLib;			//追加

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();			//追加

		public Form1()
		{
			InitializeComponent();

			//以下追加
			_mediaPlayer.settings.volume = 20;
			_mediaPlayer.URL = @"G:\Desktop\mp3\コレサワ - 君のバンド\01 君のバンド.mp3";
			_mediaPlayer.controls.play();
		}
	}
}

プロジェクトファイルをダウンロード

2016年02月17日

日本語版WTL 9.1.5321アプリケーションウィザード

■はじめに

WTLはライセンスがMS-PLのオープンソースプロジェクトとして公開されている。これを独自に日本語化しました。

リボンやタブビュー、ツリービューなどが扱えます。

Visual Studio 2015~2002に対応しています。


■ダウンロード

日本語版WTL 9.1.5321をダウンロード

(2016年2月17日現在最新版のWTLを元にしています)

2013年06月20日

アイテムが購入済みかどうかチェックする

指定したアイテムIDがアイテム内課金機能によって購入済みかどうかを調べる。

	//
	//	アプリ内課金でアイテムが購入済みかどうかチェック
	//
	//再インストール後など、購入履歴が残っていない場合は、購入済みでもfalseが返る
	//BillingService::RestoreTransactions();
	//により購入履歴を再取得する。
	//
	public bool BillingIsPurchased(String strItemID)//, ref int nQuantity)
	{
		Android.Database.ICursor cursor;

		Db db = new Db(ApplicationContext);

		if (db == null)
			return false;

		cursor = db.queryAllPurchasedItems();
		if (cursor == null)
			return false;

		try
		{
			//DBから列のインデックスを取得する
			int		nColumnProductID = cursor.GetColumnIndexOrThrow(Db.PURCHASED_PRODUCT_ID_COL);
			//int	nColumnQuantity = cursor.GetColumnIndexOrThrow(Db.PURCHASED_QUANTITY_COL);

			while (cursor.MoveToNext())
			{
				String	strProductID = cursor.GetString(nColumnProductID);

				if (strItemID == strProductID)
				{
					//nQuantity = cursor.GetInt(nColumnQuantity);
					cursor.Close();
					return true;
				}
			}
			cursor.Close();
		}
		catch (Java.Lang.IllegalArgumentException)
		{
			cursor.Close();
		}

		return false;
	}

※このコードは利用前にGoogle Play Developer Consoleでアプリ内課金を設定し、課金用のサンプルコードを実装する必要があります

画面の向きを固定する

端末を傾けたときに画面が自動で回転しないように固定する方法です。

	//画面の向きを縦(Portrait)で固定する
	RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;

トーストを表示する

数秒間だけ表示されるTIPSのような通知メッセージ「トースト」の表示方法です。
「Android.Widget.ToastLength.Long」を指定したら長時間、
「Android.Widget.ToastLength.Short」を指定したら短時間表示されます。

Toast.MakeText(this, "メッセージ", Android.Widget.ToastLength.Short).Show();

クリップボードへ文字列をコピーする

指定された文字列をクリップボードへコピーする。

	public void CopyTextToClipboard(String strText)
	{
		Android.Text.ClipboardManager cClipboardManager;

		cClipboardManager = (Android.Text.ClipboardManager)GetSystemService(ClipboardService);
		cClipboardManager.Text = strText;
	}

2013年02月03日

日本語版WTL 8.1.12085アプリケーションウィザード

test100.png

■はじめに

WTLはライセンスがCPLのオープンソースプロジェクトとして公開されている。これを独自に日本語化しました。

リボンやタブビュー、ツリービューなどが扱えます。
リボン対応のプロジェクトのビルドにはWindows 7 SDKが必要です。

Visual Studio 2012/2010/2008/2005などに対応しています。


■ダウンロード

日本語版WTL 8.1.12085をダウンロード


(2013年2月3日現在最新版のWTLを元にしています)


2011年12月27日

日本語版WTL 8.1.11324 アプリケーションウィザード

wtl001.png

■はじめに

WTLはライセンスがCPLのオープンソースプロジェクトとして公開されている。そのためおそらく勝手に日本語化したものを配布しても問題ないと思い用意しました。ライセンス的に問題があるようでしたらお知らせください。削除します。

リボンやタブビュー、ツリービューなどが扱えます。
リボン対応のプロジェクトのビルドにはWindows 7.1 SDKが必要です。


■ダウンロード

日本語版WTL 8.1.11324をダウンロード

(2011年12月27日現在最新版のWTLを元にしています)


2011年01月27日

HTC DesireのフラッシュLEDをアプリから制御する

test132_01.png
今回はHTC Desireに備わっているLED(カメラ撮影用フラッシュ)をネイティブから制御してON/OFFしてみる。

まずはHTC Developerセンターhttp://developer.htc.com/からDesireのソースコードをダウンロードする。今回は「bravo-2.6.32-gd96f2c0.tar.gz」でした。

test132_02.png
ダウンロードしている間に雛形となるプロジェクトをEasyProjectGenerator for Androidで作る。今回はC++プロジェクトとした。

test132_03.png
そして自動生成されたプロジェクトのjniフォルダに、ダウンロードしたHTC Desireのソースコードに含まれるmsm_camera.hをコピーする。

具体的なパスは「bravo-2.6.32-gd96f2c0\ include\ media\ msm_camera.h」。スクリーンキャプチャ用の環境ではtar.gzを解凍できなかったので別PCで解凍してコピーしてきました。

test132_04.png
次にEclipseでプロジェクトを読み込んで実際にLEDを制御するコードを実装する。

/dev/msm_camera/config0を開いて、int32数値を引数にしたMSM_CAM_IOCTL_FLASH_LED_CFGコマンドをioctlに送るだけです。今回はさらにMSM_CAM_IOCTL_GET_SENSOR_INFOを使って、カメラセンサー名とフラッシュサポートの有無を調べる関数も実装しました。
#if(true)
#define LOCAL_LOG
#define LOCAL_LOGD
#endif

#include <string.h>
#include <jni.h>

#ifdef LOCAL_LOG
#include <android/log.h>
#endif



#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include "msm_camera.h"

/*
 //msm_camera.hより
#define	MSM_CAM_IOCTL_MAGIC	'm'
#define	MSM_CAM_IOCTL_FLASH_LED_CFG	_IOW(MSM_CAM_IOCTL_MAGIC, 22, unsigned *)

#define MSM_CAMERA_LED_OFF 0
#define MSM_CAMERA_LED_LOW 1
#define MSM_CAMERA_LED_HIGH 2
#define MSM_CAMERA_LED_LOW_FOR_SNAPSHOT 3
*/



//
//	フラッシュコントロール
//
//nModeはMSM_CAMERA_LED_OFF、MSM_CAMERA_LED_LOW、MSM_CAMERA_LED_HIGHなど
//
//事前に↓を実行すること!
//	"chmod 666 /dev/msm_camera/config0"
//
int	CtrlCameraLED(int nMode)
{
	int		fd;
	int		nRet;

	fd = open("/dev/msm_camera/config0",O_RDWR | O_NONBLOCK);
	if(fd < 0)
		return	0;

	msm_camsensor_info	info;

	memset(&info,0,sizeof(info));
	nRet = ioctl(fd,MSM_CAM_IOCTL_GET_SENSOR_INFO,&info);
	if(nRet < 0 || info.flash_enabled == 0)
	{
		close(fd);
		return	0;
	}

	nRet = ioctl(fd,MSM_CAM_IOCTL_FLASH_LED_CFG,&nMode);
	close(fd);
	if(nRet < 0)
		return	0;

	return	1;
}


//
//フラッシュをサポートしないなら0、サポートするなら0以外を返す
//
//事前に↓を実行すること!
//	"chmod 666 /dev/msm_camera/config0"
//
int	IsSupportCameraLED(void)
{
	int		fd;
	int		nOnOff;		//uint_32
	int		nRet;
	msm_camsensor_info	info;

	fd = open("/dev/msm_camera/config0",O_RDWR | O_NONBLOCK);
	if(fd < 0)
		return	0;

	memset(&info,0,sizeof(info));
	nRet = ioctl(fd,MSM_CAM_IOCTL_GET_SENSOR_INFO,&info);
	close(fd);
	if(nRet < 0)
		return	0;

	if(info.flash_enabled)
		return	1;
	return	0;
}



//
//	カメラセンサー名の取得
//
//事前に↓を実行すること!
//	"chmod 666 /dev/msm_camera/config0"
//
int	GetCameraSensorName(char* pszName,int nLen)
{
	int		fd;
	int		nOnOff;		//uint_32
	int		nRet;
	msm_camsensor_info	info;

	if(nLen < MAX_SENSOR_NAME)
		return	0;

	fd = open("/dev/msm_camera/config0",O_RDWR | O_NONBLOCK);
	if(fd < 0)
		return	0;

	memset(&info,0,sizeof(info));
	nRet = ioctl(fd,MSM_CAM_IOCTL_GET_SENSOR_INFO,&info);
	close(fd);
	if(nRet < 0)
		return	0;

	strcpy(pszName,info.name);

	return	1;
}





extern "C"
jboolean Java_com_Test132_Test132Act_NativeIsSupportCameraLED(JNIEnv* env,jobject thiz)
{
	if(IsSupportCameraLED)
		return	JNI_TRUE;
	return	JNI_FALSE;
}

extern "C"
jboolean Java_com_Test132_Test132Act_NativeCtrlCameraLED(JNIEnv* env,jobject thiz,jint nMode)
{
	if(CtrlCameraLED(nMode))
		return	JNI_TRUE;
	return	JNI_FALSE;
}


extern "C"
jstring Java_com_Test132_Test132Act_NativeGetSensorName(JNIEnv* env,jobject thiz)
{
	char	pszName[MAX_SENSOR_NAME];

	if(GetCameraSensorName(pszName,MAX_SENSOR_NAME) == 0)
		return	env->NewStringUTF("Failed");

	return env->NewStringUTF(pszName);
}

test132_05.png
java側では、画面をタッチしたら順々にLEDの光量を変更するようにします。

また、/dev/msm_camera/config0を開くには事前にRW属性を付けておかないといけない&RW属性を付けるにはroot権限が必要なので、suコマンドによりchmodを実行する関数も作っておきます。

これで実機で実行すると、、、
package com.Test132;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.TextView;

public class Test132Act extends Activity
{
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ExecSuCommand("chmod 666 /dev/msm_camera/config0");

		NativeCtrlCameraLED(_nCurrentMode);

		TextView	tv = new TextView(this);
		tv.setText( NativeGetSensorName() );
		setContentView(tv);
	}


	
	
	boolean	ExecSuCommand(String strCommandLine)
	{
		try
		{
			Process	process = Runtime.getRuntime().exec("su");
			java.io.DataOutputStream os = new java.io.DataOutputStream(process.getOutputStream());
			os.writeBytes(strCommandLine + "\nexit\n");
			os.flush();
			process.waitFor();
			return	true;
		}
		catch(java.io.IOException e)
		{
		}
		catch (InterruptedException e)
		{
		}
		return	false;
	}


	int		_nCurrentMode = MSM_CAMERA_LED_OFF;
	
	final	static	int	MSM_CAMERA_LED_OFF = 0;
	final	static	int	MSM_CAMERA_LED_LOW = 1;
	final	static	int	MSM_CAMERA_LED_HIGH = 2;
	final	static	int	MSM_CAMERA_LED_LOW_FOR_SNAPSHOT = 3;


	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		switch(event.getAction() & MotionEvent.ACTION_MASK)
		{
		case	MotionEvent.ACTION_DOWN:
			switch(_nCurrentMode)
			{
			case	MSM_CAMERA_LED_OFF:
				_nCurrentMode = MSM_CAMERA_LED_LOW;
				break;

			case	MSM_CAMERA_LED_LOW:
				_nCurrentMode = MSM_CAMERA_LED_HIGH;
				break;

			case	MSM_CAMERA_LED_HIGH:
				_nCurrentMode = MSM_CAMERA_LED_LOW_FOR_SNAPSHOT;
				break;

			case	MSM_CAMERA_LED_LOW_FOR_SNAPSHOT:
				_nCurrentMode = MSM_CAMERA_LED_OFF;
				break;
			}

			NativeCtrlCameraLED(_nCurrentMode);
			break;
		}

		return true;
	}

	
	public native boolean  NativeIsSupportCameraLED();
	public native boolean  NativeCtrlCameraLED(int nMode);
	public native String  NativeGetSensorName();

	static
	{
		System.loadLibrary("Test132");
	}
}

test132_06.png 初回起動時に「Superuser Request The following app is requesting superuser access:」と出て、su権限を許可するかを問われます。ここで「Allow」を選択します。

test132_07.png
すると画面にカメラセンサー名の「s5k3e2fx」という文字が表示されて、画面をタッチすると、、、

DSC_0715.JPG
LEDが点灯しました。

成功のように思えるのですが、何度タッチしても光量が変わりません。本当なら3段階&OFFの4パターンが順々に変化するはずなのですが、、




プロジェクトファイルをダウンロード

前の10件 2  3  4  5  6  7  8  9  10  11  12