この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、記事の最後で紹介します)
ポイント
スマホのカメラで撮影した画像をSNSに投稿する、SNSの一般的な使い方です。
今回は、アプリで現在表示している画面のスクリーンショットを取得して、取得した画像を、直接SNSに投稿する機能の実装方法について、紹介します。
スクリーンショット画像ファイルの作成
アプリから SNS アプリの投稿画面を起動する前に、投稿する画像ファイルを作成する必要があります。
画面のスクリーンショットを取得する
getDrawingCacheを使用することで、Viewのキャッシュを取得することが可能です。
取得したキャッシュから Bitmapを作成すれば、Viewのスクリーンショットの完成です。
キャッシュを取得する前後で、setDrawingCacheEnabledを使用して、キャッシュの有効・無効を切り替えます。
:
// スクリーンショット //
public Bitmap getViewCapture(View view) {
view.setDrawingCacheEnabled(true);
// Viewのキャッシュを取得
Bitmap cache = view.getDrawingCache();
Bitmap screenShot = Bitmap.createBitmap(cache);
view.setDrawingCacheEnabled(false);
return screenShot;
}
:
画像ファイルの作成
画像ファイルの出力先として、アプリ固有の外部ストレージを使用します。
外部ストレージの入出力クラスとして、ファイルの出力先指定、Bitmapのファイル書き込み、ファイルのUri取得を実装します。
public class ExternalStorageWriter {
private final String[] type = new String[] {
Environment.DIRECTORY_DOCUMENTS,
Environment.DIRECTORY_DOWNLOADS,
Environment.DIRECTORY_PICTURES
};
private final File[] path = new File[type.length];
private File file;
private final Context context;
:
// コンストラクタ //
public ExternalStorageWriter(Context context) {
this.context = context;
for (int i=0; i< type.length; i++) {
path[i] = context.getExternalFilesDir(type[i]);
}
:
}
// ファイル指定 //
public boolean setFile(String fileName, int type) {
file = new File(path[type], fileName);
return file.exists();
}
// ファイル書込(bitmap)//
public void writeFileBitmap(Bitmap bitmap) {
if (isExternalStorageWritable()) {
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//URI取得
public Uri getUri(String fileName, int type) {
file = new File(path[type], fileName);
return FileProvider.getUriForFile(context,context.getPackageName() + ".fileProvider", file);
}
:
外部ストレージを使用する場合、AndroidManifest.xmlにエントリが必要です。
また、アプリで作成したファイルをSNSに共有しますので、FileProviderの使用をエントリします。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
:
<application
:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path"/>
</provider>
</application>
</manifest>
共有可能なディレクトリを指定する定義ファイルを作成します。
作成先(res/xml)を含むファイル名(provider_path.xml)は、AndroidManifest.xmlに記述します。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
SNSに投稿する
サンプルでは、ActionMenuViewを使用して、SNS に投稿する機能の呼び出しています。
機能メニューのタップで、外部ストレージの入出力クラスをインスタンス化して、画面のスクリーンショットの画像ファイルを作成します。
次に、作成した画像ファイルを含む、SNS に引き渡す情報をIntentにセットして、SNSアプリを起動します。
:
Context context = getApplicationContext();
:
// メニュー
ActionMenuView actionMenuView = findViewById(R.id.menu);
actionMenuView.getMenu().add(Menu.NONE, 0, Menu.NONE,context.getString(R.string.menu_sns));
:
actionMenuView.setOnMenuItemClickListener(menuItem -> {
itemId = menuItem.getItemId();
Intent intent;
switch (itemId) {
case 0: // SNS投稿
ExternalStorageWriter externalStorageWriter = new ExternalStorageWriter(context);
externalStorageWriter.setFile("sns.jpeg", 2);
externalStorageWriter.writeFileBitmap(getViewCapture(getWindow().getDecorView()));
intent = new Intent(Intent.ACTION_SEND).setPackage("com.facebook.katana");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, externalStorageWriter.getUri("sns.jpeg", 2));
intent.putExtra(Intent.EXTRA_TEXT, "ハッシュタグなど、本文を記述します");
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
break;
:
暗黙的インテントの使用に制限が追加されました。
setPackegeでSNSアプリのパッケージ名を指定します。
暗黙的インテントの不正使用
投稿先のSNSとして、Facebook、Twitter、Instagtamの使用をAndroidManifest.xmlにエントリします。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
:
<queries>
<package android:name="com.facebook.katana" />
<package android:name="com.twitter.android" />
<package android:name="com.instagram.android" />
<intent>
<action android:name="android.intent.action.ACTION_SEND" />
<data android:mimeType="image/*" />
</intent>
</queries>
:
</manifest>
今回は、ここまでです。
アプリ画面のスクリーンショットをSNSに登録する機能を実装している Androidアプリです。
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪
これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
初めての Android のアプリ開発では、アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、書籍などによる独学ではアプリ開発できるようになるには、かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。
未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪
未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪
カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪
ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪
参考になったら、💛をポッチとしてね♪
コメント欄