アーカイブ

‘android’ カテゴリーのアーカイブ

weinreでAndroidのブラウザのデバッグ

2013 年 1 月 31 日 コメントはありません

OSXでweinreのインストール。

まず、node.jsのインストール。
現在の最新版は0.8.18。

続いて、npmコマンドでのweinreのインストール。

npm install weinre

weinreの実行。

~/node_modules/weinre/weinre

ログにあるようにhttp://localhost:8080/にアクセスし起動のチェック。

「Target Script」にあるスクリプトを読み込むことで対象ページで読み込むことでデバッグ可能となる。
サンプルでは以下のようになっている。
#以降でチャンネルを指定できる。

<script src="http://localhost:8080/target/target-script-min.js#anonymous"></script>

現状だとlocalhostからのアクセスしか許可されないので、weinreをboundHostオプションを指定して起動しなおす。

~/node_modules/weinre/weinre --boundHost 0.0.0.0

対象のページにweinreを実行しているホストのIPをしてスクリプトを埋め込む。

<script src="http://x.x.x.x:8080/target/target-script-min.js#anonymous"></script>

確認は#以降で指定したチャンネルを以下のように指定する。
http://localhost:8080/client/#anonymous

カテゴリー: android タグ:

Androidでtwitter4jを利用してOAuth認証(ブラウザ)

2011 年 7 月 4 日 コメントはありません

他のIntentから遷移し、URL表示しないブラウザを立ち上げ認証したらhogehoge。

public class OAuthActivity extends Activity {
    final private String CONSUMER_KEY = "xxxxxx";
    final private String CONSUMER_SECRET = "xxxxxx";

    private String CALLBACK_URL = "myapp://oauth";
    private OAuthAuthorization oauth;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WebView webview = new WebView(this);
        setContentView(webview);

        Configuration config = new ConfigurationBuilder().build();
        oauth = new OAuthAuthorization(config);
        oauth.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        oauth.setOAuthAccessToken(null);
        try {
            String url = oauth.getOAuthRequestToken(CALLBACK_URL).getAuthorizeURL();
            webview.loadUrl(url);
        } catch (TwitterException e) {
            Toast.makeText(this, R.string.twitter_failed, Toast.LENGTH_LONG).show();
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        Uri uri = intent.getData();
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String verifier = uri.getQueryParameter("oauth_verifier");
            try {
                AccessToken at = oauth.getOAuthAccessToken(verifier);
                Log.d(getLocalClassName(), "screen_name = " + at.getScreenName());
                Log.d(getLocalClassName(), "access_token = " + at.getToken());
                Log.d(getLocalClassName(), "access_token_secret = " + at.getTokenSecret());
                // hogehoge
                Toast.makeText(this, R.string.twitter_login_success, Toast.LENGTH_LONG).show();
                finish();
            } catch (Exception e) {
                Log.w(getLocalClassName(), e.getMessage());
                Toast.makeText(this, R.string.twitter_login_failed, Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }
}

AndroidManifest.xml該当箇所。
lunchModeで多重起動させない。
あとヒストリー残さない。
ブラウザから「myapp://oauth」でIntentが起動するように。

        <activity
            android:name=".OAuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="myapp" android:host="oauth" />
            </intent-filter>
        </activity>
カテゴリー: android タグ: , , ,

Androidで画像を選択し、画像を切り抜く(クロップ)するサンプル

2011 年 6 月 20 日 コメントはありません

layoutはボタン置いてあるだけなので省略。
ボタンクリック>ギャラリーから画像選択>クロップ>なんかするhogehoge。
クロップ後のサイズ(outputX、outputY)が大きすぎるとエラーでて利用できない。
壁紙サイズは無理。

package com.example.crop;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    final private int REQUEST_CODE_GALLERY = 10;
    final private int REQUEST_CODE_CROP = 11;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button_background = (Button)findViewById(R.id.button_background);
        button_background.setOnClickListener(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
            case REQUEST_CODE_GALLERY:
                Intent intent = new Intent("com.android.camera.action.CROP");
                intent.setData(data.getData());
                intent.putExtra("outputX", 48);
                intent.putExtra("outputY", 48);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);
                startActivityForResult(intent, REQUEST_CODE_CROP);
                break;
            case REQUEST_CODE_CROP:
                Bundle ext = data.getExtras();
                if (ext != null) {
                    Bitmap bitmap = ext.getParcelable("data");
                    // hogehoge
                }
                break;
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_background:
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, REQUEST_CODE_GALLERY);
            break;
        }
    }
}
カテゴリー: android タグ:

AsyncTaskのcancel時の動き

2011 年 5 月 11 日 コメント 1 件

Android 2.1 update 1 ~ Android 2.3.2
AsyncTaskのcancel(true)を外部から呼んだ場合と、doInBackgroundで呼んだ場合挙動が異なる。
あと、cancelしてもdoInBackgroundは最後まで実行される。


public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

new AsyncTask() {
@Override
protected Void doInBackground(Void… params) {
for (int i = 0, cnt = 10; i < cnt; i++) { publishProgress(i); SystemClock.sleep(1000); if (i == 5) { cancel(true); } } return null; } @Override public void onProgressUpdate(Integer... values) { Log.d(getLocalClassName(), "count "+values[0]); } @Override protected void onCancelled() { Log.d(getLocalClassName(), "onCancelled"); } @Override protected void onPostExecute(Void result) { Log.d(getLocalClassName(), "onPostExecute"); } }.execute(); } } [/java] 結果

count 0
count 1
count 2
count 3
count 4
count 5
onPostExecute
count 6
count 7
count 8
count 9

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

AsyncTask task = new AsyncTask() {
@Override
protected Void doInBackground(Void… params) {
for (int i = 0, cnt = 10; i < cnt; i++) { publishProgress(i); SystemClock.sleep(1000); } return null; } @Override public void onProgressUpdate(Integer... values) { Log.d(getLocalClassName(), "count "+values[0]); } @Override protected void onCancelled() { Log.d(getLocalClassName(), "onCancelled"); } @Override protected void onPostExecute(Void result) { Log.d(getLocalClassName(), "onPostExecute"); } }; task.execute(); SystemClock.sleep(5000); task.cancel(true); } } [/java] 結果

count 0
count 1
count 2
count 3
count 4
onCancelled
count 5
count 6
count 7
count 8
count 9
カテゴリー: android タグ: ,

androidエミュレータのSDカードにファイルを転送する

2011 年 4 月 21 日 コメントはありません

DDMSのファイル・エクスプローラだとGUIで簡単に転送できますが、テスト用に大量に転送する必要があったのでadbコマンドを利用します。
Windowsでのお話。

転送コマンド自体は以下。

adb push ファイル名 /sdcard/転送先

SDカードは「/sdcard」としてマウントされています。

実機のSDカードをGドライブにマウントし、downloadフォルダ内のgifファイルをエミュレータのSDカード内のdownloadフォルダに転送します。
実機も認識しているため、adbのオプションで実行先をエミュレータとする「-e」オプションを指定。

for %A in (G:\download\*.gif) do adb -e push %~fA /sdcard/download

転送後、エミュレータのアプリケーション一覧から「Dev Tools > Media Scanner」でSDカードを再認識させる必要がある。

カテゴリー: android タグ: