1. 程式人生 > >Android開發:實現系統自帶截圖功能 需要獲取System許可權

Android開發:實現系統自帶截圖功能 需要獲取System許可權

在一個service介面上,點選一個button按鈕,可以截圖

貼上程式碼:

mButton.setOnClickListener(new OnClickListener(){
         public void onClick(View arg0) {
          capturescreen();
         }
         });

private void captureScreen ()

{

mHandler.postDelayed(mScreenshotChordLongPress,1000);

}

private final Runnable mScreenshotChordLongPress = new Runnable() {      
  public void run() {
   takeScreenshot();       
  }
  };
  
  final Runnable mScreenshotTimeout = new Runnable() {
   public void run() {
    synchronized (mScreenshotLock) {
     if (mScreenshotConnection != null) {
      mContext.unbindService(mScreenshotConnection);                   
            mScreenshotConnection = null;
            }
     }
    }
   };
   
 private void takeScreenshot() {
  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() {
    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;
//                           if (mStatusBar != null && mStatusBar.isVisibleLw())
                            //   msg.arg1 = 1;
//                           if (mNavigationBar != null && mNavigationBar.isVisibleLw())
                             //  msg.arg2 = 1;
                           try {
                               messenger.send(msg);
                           } catch (RemoteException e) {
                           }
                       }
                   }
                   public void onServiceDisconnected(ComponentName name) {}
               };
            
               if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) {               
                   mScreenshotConnection = conn;               
                   mHandler.postDelayed(mScreenshotTimeout, 10000);           
                   }      

           }
       }

點選button之後會停運,因為呼叫系統截圖的serivce:com.android.systemui.screenshot.TakeScreenshotService

要呼叫此service需要sysytem許可權才能呼叫:

唯有將此應用內建到手機裡面,才能獲取到sysytem許可權:

做法如下:

1.在你自己的程式當中的的mainfest.xml的manifest加上此屬性android:sharedUserId="android.uid.system"

2.內建的時候Android.mk中加上LOCAL_CERTIFICATE := PLATFORM

3.在linux環境下將此應用編譯進去。這樣就能夠實現系統自帶的截圖了