11

この問題を解決するのを手伝ってください。これは私のコードです

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

        clipboard.addPrimaryClipChangedListener(this);


        return START_STICKY;
    }

    @Override
    public void onPrimaryClipChanged() {

        Log.d("log",clipboard.getPrimaryClip()+"");

        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

        String clipText = item.getText().toString();

        Log.d("log",clipText);

        new SendClipBoardData().execute(postClipDataUrl,clipText);
    }

時々エラーが発生しますClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

エラー:java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String java.lang.CharSequence.toString()' on a null object reference

clipboard.getPrimaryClip()戻りますが、ClipData { text/plain {NULL} }コピーした同じテキストをメモに貼り付けると、テキストが表示され、問題を検出できず、機能しない場合もあります。

もう 1 つの質問は、コピーが正常に機能する場合、コピーされたテキスト結果を 2 回または 3 回取得していますが、イベントは 1 回しか機能していません。前もって感謝します。

4

1 に答える 1

8

まず第一に、クリップボードに実際データがあるという保証はまったくありません。たとえば、最初に電話の電源を入れたとき、クリップボードは空であると予想されます。次に、データがある場合は、それが正しい形式であるかどうかを確認する必要があります。画像をテキストボックスに貼り付けようとしても意味がありません。

コンテンツがない場合は、clipboard.getPrimaryClip()null を返します。コンテンツはあるがテキストではない場合(たとえば、URL はテキストとは異なる方法で処理されます)、item.getText()null が返されます。toString()null 参照で呼び出しているため、コードで例外が発生しています。

Android 開発者向けドキュメントには、次のような短いサンプルが示されています。

if (clipboard.hasPrimaryClip()
    && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))
{
    // Put your paste code here
}

しかし、前述したように、URL などの特定のものは、テキストに安全に変換できる場合でも、このパターンに一致しません。これらすべてを処理するには、これを試すことができます。

if (clipboard.hasPrimaryClip())
{
    ClipData data = clipboard.getPrimaryClip();
    if (data.getItemCount() > 0)
    {
        CharSequence text = data.getItemAt(0).coerceToText(this);
        if (text != null)
        {
            // Put your paste-handling code here
        }
    }
}
于 2016-08-16T02:42:05.867 に答える