開発者コンソール

AmazonスタイラスSDKを使用した開発の概要

AmazonスタイラスSDKを使用した開発の概要

前提条件

Android Studioのインストール

最新バージョンのAndroid Studioをダウンロードすることをお勧めしますが、これは予測タッチAPIを実装するための要件ではありません。別のIDEを使用している場合は、Android SDK(30以上)がインストールされていること、Android開発に必要なその他のシステム要件がすべて満たされていることを確認してください。このドキュメントでは、Android Studioを使用していることを前提としています。

Fireタブレット用スタイラスSDKのダウンロード

このダウンロードによって、スタイラス対応アプリに予測タッチを実装することが可能になります。SDKのコンテンツを任意の場所に展開します。

Android StudioへのSDKの追加

  1. SDKをダウンロードして任意のフォルダに保存し、zipファイルを展開します。
  2. Android Studioで、既存のプロジェクトを開くか新しいプロジェクトを作成します。
  3. フォルダ構造をAndroidからProjectに変更します。

    Android Studioでフォルダ構造を変更する画面
  4. app(以前のAndroid Studio)またはApplication(新しいAndroid Studio)の下で、libsフォルダがまだ作成されていない場合は作成します。

    Android Studioでフォルダ構造を変更する画面
  5. 手順1で展開されたStylusSDKSupportLibrary-1.0.aarを、上記で作成したlibsフォルダにコピーします。
  6. アプリのbuild.gradleファイルを開き、dependenciesオブジェクト内でAARファイルを参照します。 build.gradleファイルの依存関係セクションに、implementation filesとしてlibs/StylusSDKSupportLibrary-1.0.aarを追加します。
dependencies {
    implementation files('libs/StylusSDKSupportLibrary-1.0.aar')

これで、プロジェクトでAmazonスタイラスSDK APIを使用できるようになりました。

APIの仕様

予測タッチでは、以下のクラスとAPIを使用します。

  • com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch
  • com.amazon.stylussupportsdk.predictedtouches.AmazonPredictedEvents

AmazonPredictiveTouch:このクラスは、登録や登録解除など、予測タッチに関するあらゆるタスクを実行します。また、予測ポイントの取得を支援し、アプリから要求できるようにします。必ずisFeatureRuntimeAvailable(Context)を呼び出して、実行時にデバイスで予測タッチがサポートされているかどうかを確認してください。サポートされていない場合、ほかのAPIは役に立たないため、アプリから呼び出さないようにすることができます。次に、アプリで予測を使用するには、init(Context)を使用してAmazonPredictiveTouchを初期化する必要があります。

AmazonPredictiveTouch:このクラスは、予測された座標を格納します。このインスタンスは、アプリが AmazonPredictiveTouch#getLatestPredictions(long)を使用して要求したときに提供されます。


    /**
     * 予測タッチエンジンを初期化します。
     * アプリ/プロセスでこの呼び出しを行うのは、事前に明示的に解除した場合を除き、一度だけにする必要があります。
     * 複数回呼び出すことによるメリットはなく、同じプロセスからの重複登録が原因で
     * 予測がアプリに配信されなくなる場合があります。
     * @param ctx アプリのコンテキスト。
     */
    public static void init(Context ctx);
    
    /**
     * 必ずこのメソッドを呼び出して、実行時にデバイスで予測タッチがサポートされているか
     * どうかを確認してください。サポートされていない場合、ほかのAPIは役に立たないため、
     * アプリから呼び出さないようにすることができます。
     * @param ctx アプリのコンテキスト。
     * @return このデバイスで機能がサポートされている場合はtrue、それ以外の場合はfalse。
     */
    public static boolean isFeatureRuntimeAvailable(Context ctx);
    
    /**
     * アプリが以前に予測タッチの登録を解除していて再登録が必要な場合に、予測タッチを
     * 手動で登録します。
     * @return 機能がサポートされていて、既に登録されているか登録に成功した場合はtrue、
     * それ以外の場合はfalse。
     */
    public static boolean registerPredictiveTouches();
    
    /**
     * アプリで予測が必要なくなった場合に、予測タッチを手動で登録解除します。
     * @return 機能がサポートされていて、現在登録されていないか登録解除に成功した場合は
     * true、それ以外の場合はfalse。
     */
    public static boolean deregisterPredictiveTouches();
    
    /**
     * アプリで予測が登録済みかどうかを確認します。
     * @return 登録済みの場合はtrue、それ以外の場合はfalse。
     */
    public static boolean isPredictiveTouchesRegistered();
    
    /**
     * アプリで予測が必要なビューを設定します。
     * @param view アプリで予測を使用するビュー。nullにすることはできません。
     */
    public static void setCurrentView(View v);
    
    /**
     * アルゴリズムからPredictiveTouchManagerに送られて格納された最新の予測を取得します。
     * 機能がサポートされていない場合、または予測がない場合はnullを返します。
     * @param t アプリが保持している最新のイベントタイムスタンプ。tより後の予測を取得します。
     * @return 予測が格納された{@link AmazonPredictedEvents}オブジェクト。
     * 予測がない場合はnullになります。
     */
    public static AmazonPredictedEvents getLatestPredictions(long t);
}



    /**
     * この{@link AmazonPredictedEvents}インスタンスに含まれている予測の数を取得します。
     * @return 予測の数。
     */
    public int getNumberOfPredictions();
    
    /**
     * 渡されたインデックスの位置にある予測ポイントのx座標を取得します。アプリでは、返された値が
     * -1.0fでないかどうかを確認する必要があります。-1.0fの場合は描画に使用しないでください。
     * @param index 取得する予測ポイントのインデックス。
     * @return 渡されたインデックスが有効な場合は、その位置にある予測ポイントのx座標。それ以外の場合は-1.0f。
     */
    public float getXAt(int index);
     
    /**
     * 渡されたインデックスの位置にある予測ポイントのy座標を取得します。アプリでは、返された値が
     * -1.0fでないかどうかを確認する必要があります。-1.0fの場合は描画に使用しないでください。
     * @param index 取得する予測ポイントのインデックス。
     * @return 渡されたインデックスが有効な場合は、その位置にある予測ポイントのy座標。それ以外の場合は-1.0f。
     */
    public float getYAt(int index);
     
    /**
     * 渡されたインデックスの位置にある予測ポイントのタイムスタンプを取得します。アプリでは、返された値が
     * -1Lでないかどうかを確認する必要があります。-1Lは無効な値を示すため、使用しないでください。
     * @param index 取得する予測ポイントのインデックス。
     * @return 渡されたインデックスが有効な場合は、その位置にある予測ポイントのタイムスタンプ。それ以外の場合は-1L。
     */
    public long getEventTimeAt(int index);
}


実装手順

手順の概要

  1. AmazonPredictiveTouch.isFeatureRuntimeAvailable()を使用して、機能が利用可能かどうかを確認します。
  2. AmazonPredictiveTouch.init()を使用して、AmazonPredictiveTouchを初期化します。
  3. public static boolean isPredictiveTouchesRegistered()を使用して、PredictiveTouchesが登録済みかどうかを確認します。
  4. AmazonPredictiveTouch.registerPredictiveTouches()を使用して、予測を登録します。
  5. AmazonPredictiveTouch.setCurrentView()を使用して、予測を使用するビューを設定します。
  6. onTouchEventでMOVEイベントを識別し、そのタイムスタンプと座標を保持します。
  7. AmazonPredictiveTouch.getLatestPredictions()を使用して予測を取得し、受け取ったAmazonPredictedEventsを使用して描画します。
  8. AmazonPredictiveTouch.deregisterPredictiveTouches()を使用して、予測を登録解除します。

以降では、それぞれの手順を詳しく説明します。

手順1: Amazon予測タッチが利用可能かどうかを確認する

この機能がデバイスで利用可能かどうかを確認するには、AmazonPredictiveTouch.isFeatureRuntimeAvailable(android.content.Context context)メソッドを使用します。

機能が利用できないかサポートされていない場合、このメソッドはfalseを返します。それ以外の場合はtrueになります。

import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
 
private boolean isPredictiveTouchesSupported() {
        /* 実装例 */
        return AmazonPredictiveTouch.isFeatureRuntimeAvailable(this) == true;
}
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ..........
    ..........
    if (isPredictiveTouchesSupported()) {
        // PredictiveTouchesが利用可能です。予測を初期化して
        // 登録するコードをここに記述します。
    }
    else {
        // PredictiveTouchesは利用できません。ログメッセージに書き込みます。
        Log.w(TAG, "PredictiveTouchesがサポートされていません");
    }
}


小見出しのタイトル
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch

private fun isPredictiveTouchesSupported(): Boolean {
    /* 実装例 */
    return AmazonPredictiveTouch.isFeatureRuntimeAvailable(this)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    if (isPredictiveTouchesSupported()) {
        // PredictiveTouchesが利用可能です。予測を初期化して
        // 登録するコードをここに記述します。
    } else {
        // PredictiveTouchesは利用できません。ログメッセージに書き込みます。
        Log.w(TAG, "PredictiveTouchesがサポートされていません")
    }
}


手順2: AmazonPredictiveTouchを初期化する

初期化にはAmazonPredictiveTouch.init(android.content.Context context)を使用します。

これは、アクティビティのonCreate()メソッドか、ビューの作成時(そのビューでのみ必要な場合)に実行する必要があります。

初期化ではデフォルトでPredictionServiceへの登録も行われるため、この手順の後のAmazonPredictiveTouch.registerPredictiveTouches()の呼び出しは省略できます。

これで、アプリプロセス全体で予測タッチAPIを使用できるようになりました。

import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
 
public class MainActivity extends Activity {
      
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ..........
        ..........
        if (isPredictiveTouchesSupported()) {
            // PredictiveTouchesが利用可能です。予測を初期化して
            // 登録するコードをここに記述します。
            AmazonPredictiveTouch.init(MainActivity.this);
        }
        else {
            // PredictiveTouchesは利用できません。ログメッセージに書き込みます。
            Log.w(TAG, "PredictiveTouchesがサポートされていません");
        }
    }
}


小見出しのタイトル
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ..........
        ..........
        if (isPredictiveTouchesSupported()) {
            // PredictiveTouchesが利用可能です。予測を初期化して
            // 登録するコードをここに記述します。
            AmazonPredictiveTouch.init(this@MainActivity)
        } else {
            // PredictiveTouchesは利用できません。ログメッセージに書き込みます。
            Log.w(TAG, "PredictiveTouchesがサポートされていません")
        }
    }
}


手順3: PredictiveTouchesが登録済みかどうかを確認する

PredictiveTouchesが登録済みかどうかを確認するには、ユーティリティメソッドisPredictiveTouchesRegistered()を使用します。これはブール値を返します。

アプリで予測ポイントを受け取るには、init()またはregisterPredictiveTouches()を使用して、リスナーを初期化または登録する必要があります。registerPredictiveTouches()を使用する必要があるのは、予測が不要な特定のビューでderegisterPredictiveTouches()を呼び出した後、再び予測が必要なビューに戻る場合だけです。

手順4: 予測を登録する

この手順は、以前に予測が不要となり、計算/メモリリソースを節約するためにAmazonPredictiveTouch.deregisterPredictiveTouches()を使用したものの、後で再び予測を有効にする必要が生じた場合に実行します。

予測の受信を再開するには、AmazonPredictiveTouch.registerPredictiveTouches()メソッドを使用します。このAPIはべき等であるため、複数回呼び出す必要はなく、複数の呼び出しで動作が変わることもありません。登録が成功した場合はtrueを返し、それ以外の場合はfalseを返します。

import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
 
public class MainActivity extends Activity {
  
    @Override
    protected void onResume() {
        super.onResume();
        // 再開に伴い、ユーザーは入力や描画などを行います。以前に登録を解除した場合は、
        // 予測を登録する必要があります。
        AmazonPredictiveTouch.registerPredictiveTouches();
        .............
        .............
    }
}


小見出しのタイトル
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch

class MainActivity : Activity() {
    override fun onResume() {
        super.onResume()
        // 再開に伴い、ユーザーは入力や描画などを行います。以前に登録を解除した場合は、
        // 予測を登録する必要があります。
        AmazonPredictiveTouch.registerPredictiveTouches()
    }
}


手順5: 予測を使用するビューを設定する

各ビューには固有の幾何学的変換があります。たとえば、画面上の位置、回転、スケーリング効果が反映されます。タッチポイントは、これらに応じて変換する必要があります。

予測を使用する現在のビューに正確な予測イベントを提供するために、現在のビューを設定します。これは、予測を使用する新しいビューに切り替えることで行います。そのためには、setCurrentView(android.view.View view)メソッドを使用します。

  1. 予測タッチを使用するビューが1つだけの場合は、ビューのonMeasure()/onLayout()メソッドで呼び出すことができます。

    
     import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
        
     public class TouchDisplayView extends View {
            
         @Override
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
             AmazonPredictiveTouch.setCurrentView(this);
         }
     }
    
    
    
     import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch
    
     class TouchDisplayView : View() {
         override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
             super.onMeasure(widthMeasureSpec, heightMeasureSpec)
             AmazonPredictiveTouch.setCurrentView(this)
         }
     }
    
    
    
  2. 複数のビューで予測を使用する場合は、描画の前に、各ビューでonTouchEvent()MotionEvent.ACTION_DOWNを使用して呼び出します。このイベントは、ビューがタッチされるたびに呼び出されます。

     import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
        
     public class TouchDisplayView extends View {
        
         @Override
         public boolean onTouchEvent(MotionEvent event) {
             // 既存のコード
             final int action = event.getAction();
             switch (action & MotionEvent.ACTION_MASK) {
                 case MotionEvent.ACTION_DOWN: {
                     AmazonPredictiveTouch.setCurrentView(this);
                     // 既存のコード
                 }
             }
         }
     }
    
    
    
     import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch
    
     class TouchDisplayView : View() {
         override fun onTouchEvent(event: MotionEvent): Boolean {
             // 既存のコード
             val action = event.action
             when (action and MotionEvent.ACTION_MASK) {
                 MotionEvent.ACTION_DOWN -> {
                     AmazonPredictiveTouch.setCurrentView(this)
                 }
             }
         }
     }
    
    
    

手順6: TouchEventでMOVEイベントを識別し、そのタイムスタンプと座標を保持する

予測はMOVEイベントにのみ使用します。MOVEイベントかどうかを識別するには、onTouchEvent()メソッドを使用できます。そのタイムスタンプと座標を保持しておきます。タイムスタンプは、最新のMOVEイベントに基づいてポイントを予測するために使用します。また、最新のタッチポイントのX、Y座標の後に予測ポイントを描画したいので、座標も必要です。

これらを保持するには、onTouchEvent()mLatestXmLatestYmCurrentMoveTimeのような変数を使用できます。以下のサンプルコードを参照してください。

import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
  
public class TouchDisplayView extends View {
  
    private long mCurrentMoveTime = -1;
    private float mLatestX, mLatestY;
    private Path mCurrentStroke = new Path(); // Path to store stroke data
  
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        ............
  
        // タイムスタンプを-1に設定します。
        mCurrentMoveTime = -1;
  
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            .............
            case MotionEvent.ACTION_MOVE: {
  
                // 現在のMOVEイベントからタイムスタンプ、X、Yの値を取得します。
                mCurrentMoveTime = event.getEventTime();
                mLatestX = event.getX();
                mLatestY = event.getY();
  
                for (i in 0 until event.historySize) {
                    // 現在のストロークに履歴ポイントを追加します。
                    mCurrentStroke.lineTo(event.getHistoricalX(0, i), event.getHistoricalY(0, i))
                }
                // ここでは例としてlineToを使用しています。必要に応じてカスタムの描画ロジックを使用してください。
                mCurrentStroke.lineTo(mLatestX,mLatestY); // 現在のストロークにポイントを追加
                this.invalidate();
                break;
            }
            .............
        }
    }
}


import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch

class TouchDisplayView : View() {
    private var mCurrentMoveTime: Long = -1
    private var mLatestX = 0f
    private var mLatestY = 0f
    private val mCurrentStroke: Path = Path() // Path to store stroke data
    override fun onTouchEvent(event: MotionEvent): Boolean {


        // タイムスタンプを-1に設定します。
        mCurrentMoveTime = -1
        when (event.action and MotionEvent.ACTION_MASK) {
            MotionEvent.ACTION_MOVE -> {


                // 現在のMOVEイベントからタイムスタンプ、X、Yの値を取得します。
                mCurrentMoveTime = event.eventTime
                mLatestX = event.x
                mLatestY = event.y
                
                for (i in 0 until event.historySize) {
                    // 現在のストロークに履歴ポイントを追加します。
                    mCurrentStroke.lineTo(event.getHistoricalX(0, i), event.getHistoricalY(0, i))
                }
                
                // ここでは例としてlineToを使用しています。必要に応じてカスタムの描画ロジックを使用してください。
                mCurrentStroke.lineTo(mLatestX, mLatestY) // 現在のストロークにポイントを追加
                this.invalidate()
            }
        }
    }
}


手順7: 予測を取得して描画する

MOVEイベントを識別してタイムスタンプと座標を取得したら、そのタイムスタンプに対応する予測を取得する必要があります。

  1. getLatestPredictions(long t)を使用して、予測を取得します。
  2. これによってAmazonPredictedEventsオブジェクトが返されます。このオブジェクトを使用して、以下の操作を実行できます。
    1. getNumberOfPredictions()メソッドを使用して、予測の数を取得します。これは整数を返します。
    2. getEventTimeAt(int index)を使用して、イベント時間を取得します。これはlong型のタイムスタンプを返します。
    3. getXAt(int index)およびgetYAt(int index)メソッドを使用して、X座標とY座標を取得します。これらは浮動小数点値を返します。
  3. 予測を描画する現在のパスまたは別のパスに、予測を追加します。

  4. 予測を含むパスを描画します。
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictedEvents;
  
public class TouchDisplayView extends View {
      
    @Override
    protected void onDraw(Canvas canvas) {
  
        // mCurrentMoveTimeに対応する最新の予測を取得します。
        AmazonPredictedEvents latestPred = AmazonPredictiveTouch.getLatestPredictions(mCurrentMoveTime);
  
        Path predicted = new Path();
  
        // 最新の予測がある場合、それらをパスに追加します。
        if (mCurrentMoveTime != -1 /*有効な移動*/ && latestPred != null
                && latestPred.getNumberOfPredictions() != 0) {
            Log.i(TAG,
                    "描画開始 イベント時間:" + mCurrentMoveTime + " currentTime "
                    + SystemClock.uptimeMillis() + " latestPredTime "
                    + latestPred.getEventTimeAt(latestPred.getNumberOfPredictions() - 1));
  
            predicted.moveTo(mLatestX, mLatestY);
            for (int i = 0; i < latestPred.getNumberOfPredictions(); i++) {
                // ここでは例としてlineToを使用しています。必要に応じてカスタムの描画ロジックを使用してください。
                if (latestPred.getXAt(i) > -1.0f && latestPred.getYAt(i) > -1.0f)
                    predicted.lineTo(latestPred.getXAt(i), latestPred.getYAt(i));
            }
        }
  
        // まずキャンバスをクリアして、前回の予測ポイントが消去され、不要なアーティファクトが表示されないようにします。
        canvas.drawColor(Color.WHITE);
 
        // 実際のポイントを描画します。
        canvas.drawPath(mCurrentStroke, mPaint);
        // 見分けやすいように別のPaintオブジェクトを使用して、予測を含むパスを描画します。
        if (!predicted.isEmpty())
            canvas.drawPath(predicted, mPaintPred);
  
        if (mCurrentMoveTime != -1) {
            Log.i(TAG, "描画終了 イベント時間:" + mCurrentMoveTime + " currentTime " + SystemClock.uptimeMillis());
        }
        super.onDraw(canvas);
    }
}


import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch
import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictedEvents

class TouchDisplayView() : View() {
    override fun onDraw(canvas: Canvas) {

        // mCurrentMoveTimeに対応する最新の予測を取得します。
        val latestPred: AmazonPredictedEvents =
            AmazonPredictiveTouch.getLatestPredictions(mCurrentMoveTime)
        val predicted = Path()

        // 最新の予測がある場合、それらをパスに追加します。
        if (mCurrentMoveTime !== -1 /*有効な移動*/ && latestPred != null && latestPred.getNumberOfPredictions() !== 0) {
            Log.i(
                TAG,
                "描画開始 イベント時間:" + mCurrentMoveTime.toString() + " currentTime "
                        + SystemClock.uptimeMillis().toString() + " latestPredTime "
                        + latestPred.getEventTimeAt(latestPred.getNumberOfPredictions() - 1)
            )
            predicted.moveTo(mLatestX, mLatestY)
            for (i in 0 until latestPred.getNumberOfPredictions()) {
                // ここでは例としてlineToを使用しています。必要に応じてカスタムの描画ロジックを使用してください。
                if (latestPred.getXAt(i) > -1.0f && latestPred.getYAt(i) > -1.0f) predicted.lineTo(
                    latestPred.getXAt(i),
                    latestPred.getYAt(i)
                )
            }
        }

        // まずキャンバスをクリアして、前回の予測ポイントが消去され、不要なアーティファクトが表示されないようにします。
        canvas.drawColor(Color.WHITE)

        // 実際のポイントを描画します。
        canvas.drawPath(mCurrentStroke, mPaint)
        // 見分けやすいように別のPaintオブジェクトを使用して、予測を含むパスを描画します。
        if (!predicted.isEmpty()) canvas.drawPath(predicted, mPaintPred)
        if (mCurrentMoveTime !== -1) {
            Log.i(
                TAG,
                "描画終了 イベント時間:" + mCurrentMoveTime.toString() + " currentTime " + SystemClock.uptimeMillis()
            )
        }
        super.onDraw(canvas)
    }
}


手順8: 予測を登録解除する

PredictiveTouchesを登録解除するには、deregisterPredictiveTouches()メソッドを呼び出します。予測を必要としないアクティビティやビューにアプリが移動したとき、またはアプリがバックグラウンドに移行したときに登録を解除すると、CPUやメモリの使用量を減らすことができます。

PredictiveTouchesderegisterPredictiveTouches()は、その予測が初期化されたアクティビティ/ビューのライフサイクルと関連付けることが重要です。

たとえば、アクティビティでは、onCreate()メソッドでinit()を使用し、onDestroy()メソッドでderegisterPredictiveTouches()を使用します。プロセスは終了されずにアクティビティやビューが破棄されるシナリオの場合、PredictiveTouchesを事前に登録解除しないと、onCreate()メソッドで再び初期化することができなくなります。プロセスは終了されずにアクティビティが再作成される例として、画面の回転があります。プロセスはサービスに登録されたままですが、アクティビティの再作成によって新しいインスタンスの作成が試行されます。

登録解除に成功すると、メソッドはtrueを返します。それ以外の場合はfalseを返します。


import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch;
  
public class MainActivity extends Activity {
 
    // オプション:以下のようにすると、アプリがバックグラウンドに移行したときに予測を停止して予測タッチのメモリフットプリントを削減できます。
    @Override
    protected void onPause() {
        AmazonPredictiveTouch.deregisterPredictiveTouches();
        super.onPause();
    }
     
    // 以下は、プロセスの存続中に破棄される可能性のあるコンポーネント(アクティビティやビューなど)で必須です。
    @Override
    protected void onDestroy() {
        AmazonPredictiveTouch.deregisterPredictiveTouches();
        super.onDestroy();
    }
}


import com.amazon.stylussupportsdk.predictedtouches.AmazonPredictiveTouch

class MainActivity : Activity() {
    // オプション:以下のようにすると、アプリがバックグラウンドに移行したときに予測を停止して予測タッチのメモリフットプリントを削減できます。
    override fun onPause() {
        AmazonPredictiveTouch.deregisterPredictiveTouches()
        super.onPause()
    }

    // 以下は、プロセスの存続中に破棄される可能性のあるコンポーネント(アクティビティやビューなど)で必須です。
    override fun onDestroy() {
        AmazonPredictiveTouch.deregisterPredictiveTouches()
        super.onDestroy()
    }
}


トラブルシューティング

予測の取得や描画で問題が発生する場合は、以下を確認してください。

この機能はデバイスで使用できますか? (確認方法は手順1を参照)
解決策: Fire OSを最新バージョンにアップデートし、対応しているタブレットでFire OS 8を使用していることを確認してください。
予測タッチをサポートしていないデバイスでもアプリを利用できるようにする場合、APKを2つ管理する必要はありますか?
解決策: いいえ、2つの異なるAPKを管理する必要はありません。AmazonPredictiveTouchを初期化する前に、AmazonPredictiveTouch.isFeatureRuntimeAvailable()を使用して、デバイスが予測タッチをサポートしているかどうかを確認します。
手順7で、予測が描画されていることがわかるように、別のPaintオブジェクト(別の色など)を使用して予測を描画することはできますか?
解決策: init()の下の説明と、deregisterPredictiveTouches()メソッドの下の手順を参照してください。
予測の登録(手順4)または予測を使用するビューの設定(手順5)に失敗します。
現在、予測を受け取るチャネルは1つのプロセスで1つしかサポートされないため、init()の呼び出しはプロセスごとに1回だけにする必要があります。
ただし、複数のアクティビティや回転によって同じアクティビティが再作成され、init()が再度呼び出されることは珍しくありません。
解決策:
  • init()が呼び出されたアクティビティ/ビューの終了時に、deregisterPredictiveTouches()を使用します。
  • isPredictiveTouchesRegistered() APIを使用して、init()を呼び出す必要があるかどうかを確認します。trueが返された場合、再度init()を呼び出す必要はありません。