難読化 [難読化]
難読化は昔はちょっと面倒だったのですが、今はSDKにProGuardが統合されているので超楽です。
プロジェクト内のdefault.propertiesに
proguard.config=proguard.cfg
を一行追加するだけ。後は、普通にExport Signed Application Packageでファイルを生成してやれば良いだけです。エラーが出る場合は、それはまた別の話。
難読化にいかほどの意味があるのか分かりませんが、無いよりマシと言う程度で。
Androidのシステム情報 [その他]
http://developer.android.com/reference/android/os/Build.html
android.os.Buildから端末の情報が見れる。これで、この端末以外動作させないとかできます。
Log.d(TAG,"BOARD:" + Build.BOARD); Log.d(TAG,"BOOTLOADER:" + Build.BOOTLOADER); Log.d(TAG,"BRAND:" + Build.BRAND); Log.d(TAG,"CPU_ABI:" + Build.CPU_ABI); Log.d(TAG,"CPU_ABI2:" + Build.CPU_ABI2); Log.d(TAG,"DEVICE:" + Build.DEVICE); Log.d(TAG,"DISPLAY:" + Build.DISPLAY); Log.d(TAG,"FINGERPRINT:" + Build.FINGERPRINT); Log.d(TAG,"HARDWARE:" + Build.HARDWARE); Log.d(TAG,"HOST:" + Build.HOST); Log.d(TAG,"ID:" + Build.ID); Log.d(TAG,"MANUFACTURER:" + Build.MANUFACTURER); Log.d(TAG,"MODEL:" + Build.MODEL); Log.d(TAG,"PRODUCT:" + Build.PRODUCT); Log.d(TAG,"RADIO:" + Build.RADIO); Log.d(TAG,"SERIAL:" + Build.SERIAL); Log.d(TAG,"TAGS:" + Build.TAGS); Log.d(TAG,"TIME:" + Build.TIME); Log.d(TAG,"TYPE:" + Build.TYPE); Log.d(TAG,"USER:" + Build.USER);
カメラから画像を取得する。 [カメラ]
本などを見ると、YUVからRGBに変換して、さらにBitmapに変えてごにょごにょ…ってのが多いけど、YUVから直接JPEGに変えられる。カメラの解像度は固定で、ファイルパスは適当だけど、以下がサンプル。
private Camera.PreviewCallback mPreviewListener = new Camera.PreviewCallback() { @Override public void onPreviewFrame(final byte[] data, final Camera camera) { if (data == null) return; camera.addCallbackBuffer(data); Camera.Parameters parameters = camera.getParameters(); YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), VIDEO_WIDTH, VIDEO_HEIGHT, null); File file = new File("/path"); FileOutputStream out= new FileOutputStream(file); image.compressToJpeg( new Rect(0, 0, image.getWidth(), image.getHeight()), 40, out); out.close(); } };
2012年度カレンダー。武井咲 カレンダー 2012 【 送料無料 】
- ショップ: ひまつぶし
intentで値を渡す [Intent]
//渡す方
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra(KEY, value);
startActivity(intent);
//受け取る方
onCreate内などに
Intent intent = getIntent();
String value= intent.getStringExtra(KEY);
layoutファイルで外部のファイルを使う [layout]
つまり、layoutファイルを分割して使う。
includeを使います。
まず、別にpaintimage.xml と言う名前のレイアウトファイルを作って、後でmain.xmlの中で呼ぶ場合。
<include android:layout_width="640dip" android:layout_height="800dip" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:id="@+id/paintImage" layout="@layout/paintimage" />
上記の通り、paintimageで定義したものをlayout_widthのように上書きできる。
Canvasをクリア [ペイント]
ダイアログにシークバーを付ける [Dialog]
//レイアウト seekdialog.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dialog_root" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <SeekBar android:id="@+id/seekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" > </SeekBar> </LinearLayout>
//Activity内
LayoutInflater inflater = LayoutInflater.from(this); seekView = inflater.inflate(R.layout.seekdialog, (ViewGroup) findViewById(R.id.dialog_root)); seekbar = (SeekBar) seekView.findViewById(R.id.seekbar); seekbar.setMax(100); seekbar.setProgress(50); seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) { } public void onStartTrackingTouch(SeekBar seekBar) { } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //progressにシークの値が来る } }); Dialog dialog = new AlertDialog.Builder(this) .setTitle("seekbar") .setView(seekView) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); dialog.show();
ColorPickerDialogを使う [Dialog]
標準に用意されていないので、APIDemoにあるcom.example.android.apis.graphics.ColorPickerDialog を使います。
まず、ColorPickerDialog.java を自分のプログラムの任意のパッケージにコピーしてから。
ColorPickerDialog colorPickerDialog = new ColorPickerDialog( MainActivity.this, new ColorPickerDialog.OnColorChangedListener() { @Override public void colorChanged(int color) { //colorが選択された色 } }, Color.BLACK); colorPickerDialog.show();
【送料無料】ゼロからのAndroidアプリケ-ション開発入門
- ショップ: 楽天ブックス
ギャラリーから画像を取得する [Intent]
//呼び出す時
private static final int REQUEST_CODE_GALLERY = 99; Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, REQUEST_CODE_GALLERY);
//受け取る時
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case REQUEST_CODE_GALLERY: try { InputStream in = getContentResolver().openInputStream( data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(in); in.close(); } catch (Exception e) { } break; default: break; } }
オススメ♪スピード発送★ご購入は今すぐ★超美品■SO-03C XPERIA ray■ゴールド■docomo■携帯電話■白ロム
- ショップ: デジタル家電の王様@デジキング
ソケット通信 [通信]
例えば、Bitmapのやり取りの場合。
//クライアント側
ByteArrayOutputStream os = new ByteArrayOutputStream(); bitmap.compress(format, quality, os); byte[] bytedata =os.toByteArray(); Socket socket = null; BufferedOutputStream out = null; try { socket = new Socket(); socket.connect(new InetSocketAddress("192.168.0.10", 8888)); out = new BufferedOutputStream(socket.getOutputStream()); out.write(bytedata, 0, bytedata.length); if (out != null) out.close(); if (socket != null) socket.close(); } catch (Exception ex) { //TODO }
//サーバー側
ServerSocket servsock = null; Socket sock = null; BufferedInputStream in = null; try { servsock = new ServerSocket(8888); while (true) { sock = servsock.accept(); in = new BufferedInputStream(sock.getInputStream()); bitmap = BitmapFactory.decodeStream(in); in.close(); sock.close(); } } catch (IOException e) { } finally { if (servsock != null) { try { servsock.close(); } catch (IOException e) { } } }
ただ、ソケットが張れない場合、クソ重くなってしまうので、そこは工夫が要る。
【メール便配送可能】美玲さんの生活。super! 桐谷美玲 著/集英社
- ショップ: トップカルチャーnetクラブ