2016-04-22 12 views
0

アクセシビリティサービスを使用してアクティビティの変更が検出された場合、クリップボードのテキストを別のアプリケーションのEditTextビューに貼り付けることを実装しています。event.source()はアンドロイドでnullを返します

アクセシビリティサービスでは、アクセシビリティイベントの検出がうまく機能します。 onAccessibilityEventが呼び出されると、event.getSource()というコードはnullオブジェクトを返します。

public class ClipBoardPasteService extends AccessibilityService { 

ClipboardManager clipboard; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i("MyTag", "clipboard service created"); 
} 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    Log.i("MyTag", "ClipBoardPastedService : onAccessibilityEvent"); 
     clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 

     AccessibilityNodeInfo source = event.getSource(); 
     Log.i("MyTag", "source name : " + source.getViewIdResourceName()); 
     source.performAction(AccessibilityNodeInfo.ACTION_PASTE); 

} 


@Override 
protected void onServiceConnected() { 
    super.onServiceConnected(); 
    Log.i("MyTag", "ClipBoardPastedService : onServiceConnected"); 
    String[] packages = {"com.google.android.talk"}; 

    AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    info.flags = AccessibilityServiceInfo.DEFAULT; 
    info.packageNames = packages; 
    //AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED 
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED; 
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
    setServiceInfo(info); 
    } 
} 

、これはこれはaccessibility_service_config.xml

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/service_description" 
    android:packageNames="@null" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
    android:canRetrieveWindowContent="true" 
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" 
/> 

私が検索し、見つかった別のstackoverflowのの同様の質問が、答えは「メタが欠落している私のAndroidManifest.xml

<service 
     android:name=".ClipBoardPasteService" 
     android:enabled="true" 
     android:label="@string/app_name" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
      <category android:name="android.accessibilityservice.category.FEEDBACK_SPOKEN" /> 
     </intent-filter> 
     <!-- from ICS --> 
     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibility_service_config" /> 
    </service> 

の一部です。 「マニフェストのデータ」は意味をなさない。私のコードに何が問題なの?

答えて

1

すべてのイベントタイプにソースがあるわけではありません。イベントがソースを持つ型であることを確認し、それらのイベントを別々に処理する必要があります。

たとえば、TYPE_WINDOWS_CHANGEDにはソースはありませんが、TYPE_VIEW_SCROLLEDはソースになります。これについては、Androidのドキュメントをよくお読みください。それは少し紛らわしいですが、それには論理があります。貧弱なドキュメンテーションとAPIデザインで混乱した場合。

あなたの設定では、あなたのコードがあなたのXMLを上書きしていることにも注意してください。あなたのXMLであなたのpackagenamesの行を取り除く。そしてあなたのサービスに接続しているコードをすべて削除しました。サービス設定XMLファイルで行った設定を単純に上書きしています。

最後に、あなたがコードを使用して上書きする必要があるいくつかの設定があるはず、いくつかの動的な変更のために、あなたは常に(「ほとんど常に」読み取り)する必要があり、このようにそれを行う:これは、あなたが作成することを保証します

AccessibilityServiceInfo info = getServiceInfo(); 
//modify info to your liking 
setServiceInfo(info); 

適切に構築されたサービス情報を、あなたのXMLのパラメータを使って変更します。これは、ほとんど常に、完全に新しい構成を設定することを意図したものです。

出典: http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html

0

私は同じ問題に直面し、AndroidManifest.xmlを

<application 
    ... 
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> 
    <service 
     ... 
    </service> 
    ... 
</application> 
にこの権限を追加することで、それができ解決することができました
関連する問題