Androidアプリ開発

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

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

この記事は 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).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を習得するのに最適です。まずは無料オンライン相談から♪

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

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました