読者です 読者をやめる 読者になる 読者になる

初心者におすすめ!簡単なアプリが作れる!コードレシピ

開発 アプリ Ruby JavaScript Android

 

簡単なアプリのコードを見ることができます。

 

初心者はまずは論理は後回しにして、動くものをつくってみることがおすすめです。

実際に動いているもののコードをみて、

自分でいじってみて、

仕組みを理解していくのがいいと思います。

 

そんなときのうれしいサービスが「コードレシピ」です。

 

coderecipe.jp

 

 

 

【Android】AlertDialog 複数の選択肢

Android

 

AlertDialogで複数の選択肢の方法です。

 

final String[] items = {"登録", "削除"};
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("選択してください。");//setItemsを使用する場合、setTitleが必要
alert.setItems(items, new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
    switch(which) {
      case 0:
        ~
        break;
      case 1:
        ~
        break;
    }
  }
});
alert.create().show();

 

setTitleがないと選択肢が表示されません。

 

 

【Android】java.lang.IllegalStateException: You need to use a Theme.AppCompat theme

Android

 

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme

が発生した場合、AlertDialogのテーマを変更し対応します。

 

styles.xml

<resources>
  <style name="AlertTheme" parent="Theme.AppCompat.Light.Dialog">
  </style>
</resources>

 

AlertDialog.Builder alert = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertTheme));

 

 

Google Playで漫画が読みやすくなる「ふきだしズーム」機能が追加

 

 

セリフが小さくて読みにくいときってありますよね。

 

セリフのふきだしがズームされる機能が

Google Play ブックス

に追加されました!

 

Google では今後、

「ふきだしズーム」に対応したコミックを増やしていく予定みたいです!

 

japan.googleblog.com

 

 

f:id:stanleyblenz:20170115235417p:plain

 

 

 

【Android】画像ファイルをメールやSNSに添付する

 

 

f:id:stanleyblenz:20170115231338p:plain

 

 

画像ファイルをメールやSNSに添付するには

Intentを使用します。

 

//画像ファイルは外部ストレージから取得しています

File sendFile = new File("/storage/emulated/0/Pictures/Screenshots/20170115225515.png");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/png");//画像
intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"hoge@hoge.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "タイトル");
intent.putExtra(Intent.EXTRA_TEXT, "本文");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(sendFile));//添付ファイル
startActivity(intent);//今回のみと常時が表示

 

以上です。

 

 

【Android】横リストを作成する(RecyclerView)

 

 

f:id:stanleyblenz:20170115215219p:plain

 

 

横リストの作成方法です。

RecyclerView を使用します。

(横・縦リストが作成できます)

ListViewとほとんど同じ感じでできます。

 

build.gradle

dependencies {
  compile 'com.android.support:recyclerview-v7:23.0.1'
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  android:id="@+id/activity_main"
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:ads="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:padding="16dp">
  <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview1"
    android:layout_marginTop="10dp"
    android:layout_alignParentLeft="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</RelativeLayout>

 

recycler_adapter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">
  <TextView
    android:id="@+id/recyclerAdapterTextview"
    android:visibility="gone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</LinearLayout>

 

MainActivity.java

private RecyclerView recyclerView = null;
private RecyclerAdapter adapter = null;

private void recyclerviewCreate() {
  recyclerView = (RecyclerView)findViewById(R.id.recyclerview1);
  LinearLayoutManager manager = new LinearLayoutManager(this);
  // manager.setOrientation(LinearLayoutManager.VERTICAL);//縦リスト
  manager.setOrientation(LinearLayoutManager.HORIZONTAL);//横リスト
  recyclerView.setLayoutManager(manager);

  //データ作成
  ArrayList<ScreenShot> list = getExternalScreenShot();
  if (list == null || list.size() == 0) {
    return;
  }
  adapter = new RecyclerAdapter(this, list, this);
  recyclerView.setAdapter(adapter);
}

//コンテンツプロバイダに保存した画像(スクリーンショット)を取得

private ArrayList<ScreenShot> getExternalScreenShot() {

  ArrayList<ScreenShot> list = new ArrayList<ScreenShot>();
  String projection = new String {
    MediaStore.Images.Media.DATA};
  Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  Cursor cur = getContentResolver().query(uri,
                     projection,
                        null,
                     null,
                     null);
  if (cur == null) {
    return list;
  }
  if (cur.moveToFirst()) {
    do {
      String filepath = cur.getString(cur.getColumnIndex(MediaStore.Images.Media.DATA));
      Bitmap bitmap = BitmapFactory.decodeFile(filepath);
      ScreenShot sh = new ScreenShot(bitmap, filepath);
      list.add(sh);
    } while (cur.moveToNext());
  }
  return list;

}

 

RecyclerAdapter.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

  private LayoutInflater inflater;
  private ArrayList<ScreenShot> list;
  private RecyclerListener listener;
  public RecyclerAdapter(Context context, ArrayList<ScreenShot> list, RecyclerListener listener) {
    this.inflater = LayoutInflater.from(context);
    this.list = list;
    this.listener = listener;
  }
  @Override
  public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    return new ViewHolder(inflater.inflate(R.layout.recycler_adapter, viewGroup, false));
}
  @Override
  public void onBindViewHolder(ViewHolder viewHolder, final int i) {
    if (list != null && list.size() > 0) {
      ScreenShot item = list.get(i);
      viewHolder.imageView.setImageBitmap(item.screenshot);
      viewHolder.textView.setText(item.filepath);
    }
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      //クリック処理 コールバックを実装する(MainActivityで受ける)
      }
    });
    viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
   //ロングクリック処理 コールバックを実装する(MainActivityで受ける)
        return true;
      }
    });
  }
  //ViewHolder
  class ViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView textView;
    public ViewHolder(View itemView) {
      super(itemView);
      imageView = (ImageView)itemView.findViewById(R.id.recyclerAdapterImage);
      textView = (TextView)itemView.findViewById(R.id.recyclerAdapterTextview);
    }
  }
}

 

ScreenShot.java

public class ScreenShot implements Parcelable {

  Bitmap screenshot;
  String filepath;

  public ScreenShot(Bitmap screenshot, String filepath) {
    this.screenshot = screenshot;
    this.filepath = filepath;
  }
  protected ScreenShot(Parcel in) {
    this.screenshot = in.readParcelable(Bitmap.class.getClassLoader());
    this.filepath = in.readString();
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(screenshot, flags);
    dest.writeString(filepath);
  }
  public static final Parcelable.Creator CREATOR
      = new Parcelable.Creator() {
    public ScreenShot createFromParcel(Parcel in) {
      return new ScreenShot(in);
    }
    public ScreenShot[] newArray(int size) {
      return new ScreenShot[size];
    }
  };
}

 

 

【Android】スクリーンショットを外部ストレージに保存する

 

スクリーンショットを外部ストレージに保存するまでの説明です。

 

キーワード

・DisplayMetrics

・MediaProjection

・ImageReader

・VirtualDisplay

 

実装

private MediaProjectionManager mpm;
private MediaProjection mp;
private ImageReader ir;
private VirtualDisplay vd;
private int screenDensity;
private int displayWidth;
private int displayHeight;

 

 

private void setDisplayMetrics() {
  //画面の縦横サイズを取得
  DisplayMetrics dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);
  screenDensity = dm.densityDpi;
  displayWidth = dm.widthPixels;
  displayHeight = dm.heightPixels;
}

private void setMediaProjection(int resultCode, Intent intent) {
  mpm =  (MediaProjectionManager)getSystemService(MEDIA_PROJECTION_SERVICE);
  mp = mpm.getMediaProjection(resultCode, intent);
}

private void setVirtualDisplay() {
  ir = ImageReader.newInstance(displayWidth, displayHeight, PixelFormat.RGBA_8888, 2);
  vd = mp.createVirtualDisplay(
     "ScreenShot",
     displayWidth,
     displayHeight,
     screenDensity,
     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
     ir.getSurface(),
     null,
     null);
}

private void getScreenshotMain() {
  Image image = ir.acquireLatestImage();
  if (image != null) {
    Image.Plane[] planes = image.getPlanes();
    ByteBuffer buffer = planes[0].getBuffer();
    int pixelStride = planes[0].getPixelStride();
    int rowStride = planes[0].getRowStride();
    int rowPadding = rowStride - pixelStride * displayWidth;
    //バッファからBitmapを生成
    Bitmap bitmap = Bitmap.createBitmap(
        displayWidth + rowPadding / pixelStride,
        displayHeight,
        Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(buffer);
    image.close();

    saveImage(bitmap);
  }
}

private File saveImage(Bitmap bitmap) {
  //画像を外部ストレージに保存
  DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  Date date = new Date(System.currentTimeMillis());
  String timeStamp = df.format(date);
  String name = timeStamp + ".png";
  File imageFile = getImageDir(name);
  try {
    FileOutputStream out = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.close();
  } catch (Exception e) {
    e.printStackTrace();
  }

  //ContentResolverは端末の起動時に更新されるので
  //スクリーンショット取得時にContentResolverを更新する

  String imagePath = imageFile.getAbsolutePath();
  String imageName = imageFile.getName();
  String imageTitle = imageName.substring(0, imageName.indexOf("."));
  ContentResolver cr = getContentResolver();
  ContentValues values = new ContentValues();
  values.put(MediaStore.Images.ImageColumns.DATA, imagePath);
  values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, imageName);
  values.put(MediaStore.Images.ImageColumns.TITLE, imageTitle);
  values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");
  cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  return imageFile;
}

public File getImageDir(String imageName) {
  File imagefile = new File("/storage/emulated/0/Pictures/Screenshots/" + imageName);
  try {
    imagefile.createNewFile();
  } catch (IOException e) {
    e.printStackTrace();
  }
  return imagefile;
}

 

以上です。