カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

GoogleMap 複数のポイントのアイコン切替

ItemizedOverlayクラスを継承してGoogleMapに複数のポイントを表示する際、アイコンを変えたい場合、レイヤーを別にする必要があります。
同じレイヤーでアイコンを変えたい場合には、アイコン生成時に呼ばれる「createItem」メソッド内で変えるようにするとできるようです。

その際はアイコン用のリストを作り、switch文などで切り替えすると便利です。

public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private List<GeoPoint> points = new ArrayList<GeoPoint>();
    private List<Integer> icontype = new ArrayList<Integer>();
    private Context context;

    public PinItemizedOverlay(Drawable defaultMarker, Context context) {
        super( boundCenterBottom(defaultMarker) );
        setLastFocusedIndex(-1);
        populate();
        this.context = context;
    }

    @Override
    protected OverlayItem createItem(int i) {

        Drawable icon = null;
        switch(icontype.get(i)) {
            case 0:
                icon = context.getResources().getDrawable(R.drawable.icon0);
                break;
            case 1:
                icon = context.getResources().getDrawable(R.drawable.icon1);
                break;
            case 2:
                icon = context.getResources().getDrawable(R.drawable.icon2);
                break;
            default:
                icon = context.getResources().getDrawable(R.drawable.icon0);
                break;
        }

        GeoPoint point = points.get(i);
        OverlayItem overlayItem = new OverlayItem(point, null, null);
        overlayItem.setMarker(boundCenterBottom(icon));
        return overlayItem;
    }

    public void addPin(GeoPoint point, String title, String snippet, int icontype) {
        if (getIndexGeoPoint(point) == -1) {
            this.points.add(point);
            this.icontype.add(icontype);
        }
        setLastFocusedIndex(-1);
        populate();
    }

    // 位置が一致するか(一致しない場合は -1を返す)
    private int getIndexGeoPoint(GeoPoint newPoint) {
       int result = -1;
       int size = this.points.size();
       for (int i = 0; i < size; i++) {
          GeoPoint point = this.points.get(i);
          if (point.equals(newPoint)) {
             result = i;
             break;
          }
       }
       return result;
    }
}
2,749 views

SDカード内画像の削除

SDカードに画像を保存する際、同じ名前で上書き保存すると、画像自身は上書きされますが、
元画像のサムネイルだけが残ってしまいます。
実際は、サムネイルとデータベースにもデータが残っているのではないでしょうか。
そのため、上書き保存したい場合は、データベースから削除する必要があります。

String PATH = Environment.getExternalStorageDirectory().toString();
Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
File file = new File(PATH, filename);

if(file.exists()) {
    String[] proj = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, MediaStore.Images.Media.DATA + " = ?", new String[] { PATH + "/" + filename }, null);
    if(cursor.getCount() != 0) {
        cursor.moveToFirst();
        Uri deleteUri = ContentUris.appendId(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon(),
            cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID))).build();
        getContentResolver().delete(deleteUri, null, null);
    }
    file.delete();
}
6,772 views

Toastに画像を表示する

本来、テキストを表示するToastですが、画像を表示することもできます。
画像の周りに白い余白をつけて、4分の1サイズで表示するサンプルです。

private void showImgToast(String filename) {
    int WC = ViewGroup.LayoutParams.WRAP_CONTENT;

    ImageView v = new ImageView(this);
    v.setImageURI(Uri.parse(filename));
    v.setLayoutParams(new LayoutParams(WC, WC));
    v.setBackgroundColor(Color.WHITE);
    v.setPadding(5, 5, 5, 5);

    BitmapFactory.Options bmOp = new BitmapFactory.Options();
    bmOp.inSampleSize = 4;
    v.setImageBitmap(
        BitmapFactory.decodeFile(
                filename,
                bmOp));

    Toast myToast = new Toast(this);
    myToast.setDuration(100);
    myToast.setGravity(Gravity.CENTER, 0, 0);
    myToast.setView(v);
    myToast.show();
}
2,796 views

コンテンツプロバイダ

メディア関係のURIのリストです。

MediaStore.Images.Media.INTERNAL_CONTENT_URI     //内部メディアの画像
MediaStore.Images.Media.EXTERNAL_CONTENT_URI     //外部メディアの画像

MediaStore.Video.Media.INTERNAL_CONTENT_URI      //内部メディアの動画
MediaStore.Video.Media.EXTERNAL_CONTENT_URI      //外部メディアの動画

MediaStore.Audio.Media.INTERNAL_CONTENT_URI      //内部メディアの音楽
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI      //外部メディアの音楽
MediaStore.Audio.Albums.INTERNAL_CONTENT_URI     //内部メディアの音楽アルバム
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI     //外部メディアの音楽アルバム

MediaStore.Video.Thumbnails.INTERNAL_CONTENT_URI //内部メディアの動画のサムネイル
MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI //外部メディアの動画のサムネイル
2,291 views

画像を添付してメールを送信する

SDカードの画像を添付してメーラーを起動します。
本体に保存されている画像は添付できないようです。
送信はできるが、添付されない。

private String PATH = Environment.getExternalStorageDirectory().toString();
private Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

private void sendmail() {

    Intent intent = new Intent(Intent.ACTION_SEND);

    String[] strTo = { "sample@example.com" };

    intent.putExtra(Intent.EXTRA_EMAIL, strTo);
    intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
    intent.putExtra(Intent.EXTRA_TEXT, "本文");

    Uri attachments = Uri.parse("file://" + PATH + "/sample.jpg");
    intent.putExtra(Intent.EXTRA_STREAM, attachments);
    intent.setType("image/jpeg");

    startActivity(Intent.createChooser(intent, "Choose Email Client"));
}

以下のパーミッション許可が必要
続きを読む…»

4,959 views