2017-12-12 27 views
0

私はそこにいくつかの類似のスレッドがあることを知っています。私はそれらを試しましたが、どれも私のために働いていないようです。私はAndroidでキャプチャスクリーンショットをしようとしていますが、残念ながら、それはクラッシュして、私にこのエラーを与え続けます。 AndroidMaifest.xmlでは、名前が認識されないかのように赤で表示されます。java.lang.SecurityException:サービスにバインドできません

public class ScreenshotAction extends SinglePressAction { 

private static Context mContext; 
private String mScreenshotLabel; 
private Drawable mScreenshotIcon; 
private static final Object mScreenshotLock = new Object(); 
private static ServiceConnection mScreenshotConnection = null; 

public ScreenshotAction(){ 
    super(); 
} 

public ScreenshotAction(Context context, String screenshotLabel, Drawable screenshotIcon) { 
    super(context); 
    mContext = context; 
    mScreenshotLabel = screenshotLabel; 
    mScreenshotIcon = screenshotIcon; 
} 

@Override 
protected void setupLabel(TextView labelView) { 
    labelView.setText(mScreenshotLabel); 
} 

@Override 
protected void setupIcon(ImageView icon) { 
    icon.setImageDrawable(mScreenshotIcon); 
} 

@Override 
protected void onPress() { 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      takeScreenshot(handler); 
      Toast.makeText(mContext, "screenshot ok", Toast.LENGTH_LONG).show(); 
     } 
    }, 1000); 
} 

public static void takeScreenshot(final Handler mHandler) { 
    synchronized (mScreenshotLock) { 
     if (mScreenshotConnection != null) { 
      return; 
     } 
     ComponentName cn = new ComponentName("com.android.systemui", 
       "com.android.systemui.screenshot.TakeScreenshotService"); 
     Intent intent = new Intent(); 
     intent.setComponent(cn); 
     ServiceConnection conn = new ServiceConnection() { 
      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 
       synchronized (mScreenshotLock) { 
        if (mScreenshotConnection != this) { 
         return; 
        } 
        Messenger messenger = new Messenger(service); 
        Message msg = Message.obtain(null, 1); 
        final ServiceConnection myConn = this; 

        Handler h = new Handler(mHandler.getLooper()) { 
         @Override 
         public void handleMessage(Message msg) { 
          synchronized (mScreenshotLock) { 
           if (mScreenshotConnection == myConn) { 
            mContext.unbindService(mScreenshotConnection); 
            mScreenshotConnection = null; 
            mHandler.removeCallbacks(mScreenshotTimeout); 
           } 
          } 
         } 
        }; 
        msg.replyTo = new Messenger(h); 
        msg.arg1 = msg.arg2 = 0; 
        try { 
         messenger.send(msg); 
        } catch (RemoteException e) { 
        } 
       } 
      } 
      @Override 
      public void onServiceDisconnected(ComponentName name) {} 
     }; 

     if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) { 
      mScreenshotConnection = conn; 
      mHandler.postDelayed(mScreenshotTimeout, 10000); 
     } 
    } 
} 

private static final Runnable mScreenshotTimeout = new Runnable() { 
    @Override 
    public void run() { 
     synchronized (mScreenshotLock) { 
      if (mScreenshotConnection != null) { 
       mContext.unbindService(mScreenshotConnection); 
       mScreenshotConnection = null; 
      } 
     } 
    } 
    }; 
} 

エラー: -

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: ......, PID: 6022 
       java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.android.systemui/.screenshot.TakeScreenshotService } 
        at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1595) 
        at android.app.ContextImpl.bindService(ContextImpl.java:1559) 
        at android.content.ContextWrapper.bindService(ContextWrapper.java:517) 

AndroidMaifest.xml

この名前は、それはそれを認識していないことを私に語った赤です。

<service android:name=".screenshot.TakeScreenshotService" 
     android:process=":screenshot" 
     android:exported="true" /> 

答えて

0

I'm trying capture Screenshots in Android

のAndroid 5.0+のメディア投影APIを使用してください。

It keeps crashing and giving me this error

あなたはそのサービスにバインドする権利がありません。あなたは、そのサービスが任意のデバイスに存在するかどうかも分かりません。

This name is in red which tells me that it doesn't recognise it.

これは、あなたがそのサービスを書いていないためです。

+0

上記は4.2.1で動作する瞬間に4.4.4で動作する必要がありますが、4.4ではクラッシュします。 +任意の提案? – Tony

+0

@トニー:メディアプロジェクションAPIを使用して、スクリーンショットを提供したり、APIレベル21以上(Android 5.0以降)のスクリーンショットのみを提供してください。 Android 5.0より前のスクリーンショットをプログラムでリクエストする手段はありません。 – CommonsWare

+0

ありがとうございました。問題は、私が投稿したものと同じコードを使用して、同じハードウェアとAndroidバージョンでそのアプリケーションが動作するアプリケーションを開発した別の当事者がいることです。私は上記のように、Android 4デバイスで動作するコードを使用しているバージョンのアプリケーションを持っていますが、その1つのみで動作し、他のアプリケーションでは上記のエラーでクラッシュします。 1つのデバイスに設定されているライブラリ/アクセス許可が存在する可能性がありますが、このアプリケーション/コードに関連して他のデバイスには設定されていない可能性があります。私はいくつかのデバッグをログに追加しました。 – Tony

関連する問題