2016-02-24 38 views
5

Tôi cần tạo một dịch vụ giúp kiểm tra tọa độ của màn hình Android với màu của pixel.Nhận màu pixel ở chế độ nền trên Android

Ví dụ:

Bitmap bitmap = ((BitmapDrawable)getBackground()).getBitmap(); 
int pixel = bitmap.getPixel(x,y); 

if(pixel == Color.MAGENTA){ 
    //Stop Service 
} 

Tuy nhiên thay vì chỉ ứng dụng của tôi, tôi cần nó ở chế độ nền để kiểm tra màu ngay cả khi tôi chuyển ứng dụng.

Giả sử thiết bị được bắt nguồn từ, có bất kỳ lệnh superuser nào thực hiện những gì tôi cần không?

+0

này nghe có vẻ khủng khiếp không hiệu quả và cồng kềnh. Tại sao không khám phá các tùy chọn khác? – JoxTraex

+0

sử dụng bộ thu phát sóng trong dịch vụ của bạn và gửi truyền phát từ hoạt động của bạn và đăng ký chương trình phát sóng trong dịch vụ của bạn – Bhargav

+0

Mục tiêu ở đây là gì? Bạn đang cố kiểm tra cái gì? Bạn muốn biết khi nào ví dụ một pixel magenta được hiển thị ở vị trí x, y trên màn hình từ bất kỳ ứng dụng nào (ví dụ Facebook)? Các câu trả lời là tất cả nhìn vào những thứ chỉ hiển thị trong ứng dụng của bạn vì vậy bạn cần phải rõ ràng –

Trả lời

1

Đối với những ai cần phải làm một cái gì đó giống như tôi đang làm,

tôi đã sử dụng của hệ thống chỉ huy/system/bin/-p screencap để chụp màn hình và kiểm tra các điểm ảnh trên màn hình.

Phương pháp này đòi hỏi phải có sự cho phép gốc

private void getPixelColor(int xcoord, int ycoord) 
{ 
    try { 
     Process sh = Runtime.getRuntime().exec("su", null,null); 

     OutputStream os = sh.getOutputStream(); 
     os.write(("/system/bin/screencap -p " + "/sdcard/colorPickerTemp.png").getBytes("ASCII")); 
     os.flush(); 

     os.close(); 
     sh.waitFor(); 

     Bitmap screen = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + File.separator + "colorPickerTemp.png"); 
     int pixel = screen.getPixel(xcoord ,ycoord + statusHeight); 
     Log.d("pixel color", "Pixel Color: + " + Integer.toHexString(pixel) + " at x:" + xcoord + " y:" + ycoord); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
-2

Như đã nêu. không hiệu quả nói chung ... có lẽ là cách tốt hơn để bạn triển khai ứng dụng của mình.

public boolean checkColor() { 
     View rootView = findViewById(android.R.id.content).getRootView(); 
     rootView.setDrawingCacheEnabled(true); 
     Bitmap bitmap = rootView.getDrawingCache(); 
     rootView.setDrawingCacheEnabled(false); 
     int pixel = bitmap.getPixel(x,y); 
     if(pixel == Color.MAGENTA){ 
      return true; 
     } 
     return false; 
    } 
3
public class TouchView extends ImageView { 

Bitmap bitmap; 
double bmWidth, bmHeight; 

public TouchView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

public TouchView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

public TouchView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

private void init(){ 

    bitmap = ((BitmapDrawable)getBackground()).getBitmap(); 
    bmWidth = (double)bitmap.getWidth(); 
    bmHeight = (double)bitmap.getHeight(); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // TODO Auto-generated method stub 
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), 
     MeasureSpec.getSize(heightMeasureSpec)); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 


    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_MOVE: 
    float x = event.getX(); 
    float y = event.getY(); 

    int color = getColor(x, y); 
     ((AndroidDetechTouchActivity)getContext()).updateMsg("[email protected]" + x + " : " + y, color); 

    break; 
    case MotionEvent.ACTION_UP: 
    ((AndroidDetechTouchActivity)getContext()).updateMsg("", 0); 
    break; 
    } 

    return true; 
} 

private int getColor(float x, float y){ 

    if (x < 0 || y < 0 || x > (float)getWidth() || y > (float)getHeight()){ 
    return 0; //Invalid, return 0 
    }else{ 
    //Convert touched x, y on View to on Bitmap 
    int xBm = (int)(x * (bmWidth/(double)getWidth())); 
     int yBm = (int)(y * (bmHeight/(double)getHeight())); 

    return bitmap.getPixel(xBm, yBm); 
    } 

} 

} 

Sửa updateMsg() phương pháp hoạt động chính, AndroidDetechTouchActivity.java, bao gồm màu sắc và cập nhật Format TextView của.

public class AndroidDetechTouchActivity extends Activity { 

TextView msg; 
TouchView touchView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     msg = (TextView)findViewById(R.id.msg); 
     touchView = (TouchView)findViewById(R.id.touchview); 

    } 

    public void updateMsg(String tMsg, int color){ 
    msg.setTextColor(color); 
    msg.setText(tMsg); 
    } 

} 
+0

Xin chào, cảm ơn bạn đã trả lời và mã tuyệt vời này, tuy nhiên điều này có được màu pixel của các ứng dụng khác không? –

Các vấn đề liên quan