エントリー

タグ「Android」の検索結果は以下のとおりです。

Android版GPUImageで画像加工

画像や動画にエフェクトをかけることができるライブラリである、GPUImageをAndroidから使ってみたのでメモ。

サンプル実行

NDK(Android Native Development Kit)のインストールが必要

GradleでNDKを自動インストールしてくれるプロジェクトもあるが、GPUImage for Android のサンプルはそうなっていない。Android Studio で

ファイル → 設定 → SDK Tools → NDK

にチェックを入れて適用すると、NDKがインストールされる。インストールされたら

C:\Users\ユーザ名\AndroidStudioProjects\GPUImage\local.properties

ndk.dir=C\:\\Users\\ユーザ名\\AppData\\Local\\Android\\Sdk\\ndk-bundle

のパスが正しいことを確認する。

さらに

C:\Users\ユーザ名\AndroidStudioProjects\GPUImage\library\build.gradle

の12行目を編集。(gitからバージョンコードを取得している?ようだが、取れずにエラーになるので適当な数値を設定)

versionCode "git rev-list origin/master --count".execute().text.toInteger()
↓
versionCode 1

まだ謎エラーが出るようなら、

ビルド → Clean Project
ビルド → Rebuild Project

を試す。問題がなくなると追加ライブラリのインストールを求められたのでインストール。その後実行すると、サンプルを実機にインストールできた。

プロジェクトに組み込み

C:\Users\ユーザ名\AndroidStudioProjects\プロジェクト名\app\build.gradle

のdependenciesに以下を追加

//GPUImage
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'

これだけでプロジェクトにGPUImageが組み込まれるので、あとは呼び出すだけ。以下Intentから画像を選択して、その結果にフィルタをかけて表示するサンプルの抜粋。

// Intentを取得
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQUEST_GALLERY);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_GALLERY && resultCode == RESULT_OK) try {
        InputStream in = getContentResolver().openInputStream(data.getData());
        Bitmap img = BitmapFactory.decodeStream(in);
        in.close();

        // GPUImageで画像を加工
        GPUImage mGPUImage = new GPUImage(this);
        mGPUImage.setFilter(new GPUImageSobelEdgeDetection());
        mGPUImage.setImage(img);
        img = mGPUImage.getBitmapWithFilterApplied();

        // 画像を表示
        imageViewer.setImageBitmap(img);

        Toast.makeText(MainActivity.this, "画像を選択しました", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

AndroidでHTTP通信

2年くらい前にAndroidをさわったときは org.apache.http でHTTPリクエストしていたけど、今は使えなくなっているらしい。

どうやら、OkHttpというのを使うのがイマドキらしい。ので試してみた。

確かに org.apache.http を使うよりも、超シンプルなコードになるのでいい感じ。以前作った org.apache.http を簡単に扱えるようにするクラスが用済みになってしまったけど、無事に通信できたので良しとする。

以下、上に書かれた内容と同じだけど自分の作業メモ。

compile 'com.squareup.okhttp:okhttp:2.5.0'

でライブラリを取り込んで、マニフェストファイルで

<uses-permission android:name="android.permission.INTERNET" />

を指定して、以下のコードで通信テスト。リソースファイルは略。

package org.refirio.request;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;

public class MainActivity extends Activity {

    private TextView message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        message = (TextView)this.findViewById(R.id.message);

        // データ取得(GET)
        Button button_get = (Button)this.findViewById(R.id.button_get);
        button_get.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                new AsyncTask<Void, Void, String>() {
                    @Override
                    protected String doInBackground(Void... params) {
                        String result = null;

                        // リクエストオブジェクトを作って
                        Request request = new Request.Builder()
                                .url("http://httpbin.org/headers")
                                .get()
                                .build();

                        // クライアントオブジェクトを作って
                        OkHttpClient client = new OkHttpClient();

                        // リクエストして結果を受け取って
                        try {
                            Response response = client.newCall(request).execute();
                            result = response.body().string();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        // 返す
                        return result;
                    }

                    @Override
                    protected void onPostExecute(String result) {
                        message.setText("Result: " + result);
                    }
                }.execute();

            }

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed