PR
Androidアプリ開発

スクリーンショットを取得して、
SNSに投稿する

この記事は約13分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


スクリーンショットを取得して、画像ファイルをSNSに投稿する

ポイント

スマホのカメラで撮影した画像を 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);
                    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;
               :

投稿先の 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# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

副業でアプリケーション開発と考えているなら、おススメです。
無料説明会に参加して、話を聞くだけでもためになるよ♪

ITスキルを身に付け、キャリアアップ。オンライン授業で仕事と両立できます。
まずは資料請求から♪

サイバー大学

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

無料でJava言語を学べるのは、かなり魅力的♪
でも、応募資格は35歳以下です、、、
2022年12月から説明会が土曜日開催が追加されていますよ♪
説明会では、希望者に対してプログラミング体験もできるよ♪

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

コメント欄