私はそこにいくつかの類似のスレッドがあることを知っています。私はそれらを試しましたが、どれも私のために働いていないようです。私は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" />
上記は4.2.1で動作する瞬間に4.4.4で動作する必要がありますが、4.4ではクラッシュします。 +任意の提案? – Tony
@トニー:メディアプロジェクションAPIを使用して、スクリーンショットを提供したり、APIレベル21以上(Android 5.0以降)のスクリーンショットのみを提供してください。 Android 5.0より前のスクリーンショットをプログラムでリクエストする手段はありません。 – CommonsWare
ありがとうございました。問題は、私が投稿したものと同じコードを使用して、同じハードウェアとAndroidバージョンでそのアプリケーションが動作するアプリケーションを開発した別の当事者がいることです。私は上記のように、Android 4デバイスで動作するコードを使用しているバージョンのアプリケーションを持っていますが、その1つのみで動作し、他のアプリケーションでは上記のエラーでクラッシュします。 1つのデバイスに設定されているライブラリ/アクセス許可が存在する可能性がありますが、このアプリケーション/コードに関連して他のデバイスには設定されていない可能性があります。私はいくつかのデバッグをログに追加しました。 – Tony