Capturing writing on the touch screen - android

My application has a requirement where the user can write their signature on the screen. The signature should be able to be extracted into an image.
How should I go about this ?
Is there an existing android process/observer for this ? Or are they any libraries / plugins that might allow the functionality ?

use this code in Activity:
try {
GestureOverlayView gestureView = (GestureOverlayView) findViewById(R.id.signaturePad);
gestureView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(gestureView.getDrawingCache());
File f = new File(Environment.getExternalStorageDirectory()+ File.separator + "signature.png");
f.createNewFile();
FileOutputStream os = new FileOutputStream(f);
os = new FileOutputStream(f);
//compress to specified format (PNG), quality - which is ignored for PNG, and out stream
bm.compress(Bitmap.CompressFormat.PNG, 100, os);
os.close();
} catch (Exception e) {
Log.v("Gestures", e.getMessage());
e.printStackTrace();
}
}
In xml:
<android.gesture.GestureOverlayView
android:id="#+id/signaturePad"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:background="#android:color/white"
android:eventsInterceptionEnabled="true"
android:fadeEnabled="false"
android:gestureColor="#android:color/black"
android:gestureStrokeLengthThreshold="0.1"
android:gestureStrokeType="multiple"
android:orientation="vertical"/>

Related

Taking screenshot of a view gives black image?

I tried to take a screenshot of a imageview programatically! When the image is saved to folder it is producing black image! when i tried to take screenshot of my entire scroll view, I am able to take screenshot. Please help:
my Code is:
private void saveop(){
RelativeLayout parent = (RelativeLayout) findViewById(R.id.opimagelayout);// which includes your view or buttons?
Bitmap bitmap = Bitmap.createBitmap(384,
100, Bitmap.Config.ARGB_8888);
Canvas bitmapHolder = new Canvas(bitmap);
parent.draw(bitmapHolder);
try {
final File f = savebitmaps(bitmap,"operator","");
} catch (IOException e) {
e.printStackTrace();
}
}
public static File savebitmaps(Bitmap bmp,String transno, String currentDateandTime) throws IOException {
Bitmap out = BITMAP_RESIZER(bmp, 384,112);
File folder = new File(Environment.getExternalStorageDirectory() + "/MobeeLoad");
File file = new File(folder, transno+".jpg");
FileOutputStream fOut;
try {
fOut = new FileOutputStream(file);
out.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
bmp.recycle();
out.recycle();
} catch (Exception e) {
}
bmp.recycle();
return file;
}
Layout xml:
<RelativeLayout
android:id="#+id/opimagelayout"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_below="#+id/date"
android:layout_height="90dp">
<ImageView
android:id="#+id/opimage"
android:layout_width="90dp"
android:src="#drawable/check"
android:layout_centerHorizontal="true"
android:layout_height="90dp" />
</RelativeLayout>

Screenshot using drawing cache and saving to file adds noise to image

I have multiple activities that each one apply some visual effects on screen then save and send it's uri to another activity,but after each process(getDrawingCache + save + send)some noises appear on image,this is my code:
FrameLayout frame1=(FrameLayout) findViewById(R.id.finalview_new);
frame1.setDrawingCacheEnabled(true);
frame1.buildDrawingCache();
Bitmap bitmap=frame1.getDrawingCache();
String fileName = "myImage";//no .png or .jpg needed
try {
ByteArrayOutputStream bytes =
new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
FileOutputStream fo =
openFileOutput(fileName, aftertext.this.MODE_PRIVATE);
fo.write(bytes.toByteArray());
// remember close file output
fo.close();
} catch (Exception e) {
e.printStackTrace();
fileName = null;
}
ed.setVisibility(View.VISIBLE);
onCreate(null);
This is the culprit
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
JPEG is a lossy format. Use the BitmapFormat.PNG option instead.

Sharing photo at xml view

i want to share a photo that is at my xml view but any sharing intenet requires that photo should be saved on memory card. how can i use that photo?
this is my xml:
<Button
android:id="#+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/textView1"
android:layout_below="#+id/textView1"
android:layout_marginLeft="17dp"
android:text="Button" />
<ImageView
android:id="#+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="#drawable/ellyfish" />
You can try something like this:
First get the bitmap from imageview:
Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
Create a new file using this bitmap:
public File createImageFromBitmap(Bitmap bitmap) {
File f ;
try {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
// you can create a new file name "test.jpg" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "rwd_temp.jpg");
f.createNewFile();
// write the bytes in file
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
// remember close de FileOutput
fo.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return f;
}
What I am doing is getting the bitmap from the imageview and saving that bitmap in a file named rwd_temp.jpg. After you have the file you can upload it to server or share it.
You will require WRITE_EXTERNAL_STORAGE permission for this.

Android webview screenshot white border

i followed this link to screenshot my webview completely. It works fine.
But I have an issue. The screenhot that I get from the webview contains white spaces on the top and bottom of the picture? How do I get rid of this? Kindly let me know.
This is the code that I've used for capturing from webview. IF YOU LOOK PROPERLY THERE IS WHITESPACE BOTH AT THE BOTTOM AND TOP PARTS OF THE IMAGE.
public static String saveCapturedImageToSdCard() {
Picture picture = WebViewActivity.sWebViewEx.capturePicture();
Bitmap b = Bitmap.createBitmap( picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
File file = null;
Canvas c = new Canvas( b );
picture.draw( c );
// FileOutputStream fos = null;
try {
file = new File(Environment.getExternalStorageDirectory()+"/"+"temp.png");
if(file != null && !file.exists())
file.createNewFile();
// write the bytes in file
FileOutputStream fos = new FileOutputStream(file);
fos = new FileOutputStream(file);
if ( fos != null )
{
b.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
}
}
catch( Exception e )
{
}
return file.getPath().toString();
}
This is the image that I get from the webview:
My XML is:
<WebView
android:id="#+id/webview"
android:layout_below="#id/linearlayout_topbuttons"
android:layout_above="#id/gallery_webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:overScrollMode="never"
android:fitsSystemWindows="true"
android:background="#android:color/transparent"
android:layout_centerInParent="true"
/>

Android -- taking a screen shot

I need to take a screen shot and save the screen shot. I need to do this without using any connection to PC or without unrooting the phone. I need to do this whenever a event is triggered . For example when an ad is shown in a game ... or when the game ends and shows the scores in snake etc. Can you please let me know How Can i do this. I saw some tutorilas and they gave the code but that doesnt seem to work
private void getScreen()
{
View content = findViewById(R.id.layoutRoot);
Bitmap bitmap = content.getDrawingCache();
File file = new File("/sdcard/test.png");
try
{
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, ostream);
ostream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
You have to enable the cache first, before calling getDrawingCache().
View ve = findViewById(R.id.loyout);
ve.setDrawingCacheEnabled(true);
Bitmap b = ve.getDrawingCache();
String extr = Environment.getExternalStorageDirectory().toString()
+ "/SaveCapture";
myPath = new File(extr);
if (!myPath.exists()) {
boolean result = myPath.mkdir();
Toast.makeText(this, result + "", Toast.LENGTH_SHORT).show();
}
myPath = new File(extr, getString(R.string.app_name) + ".jpg");
Toast.makeText(this, myPath.toString(), Toast.LENGTH_SHORT).show();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(myPath);
b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
MediaStore.Images.Media.insertImage(getContentResolver(), b,
"Screen", "screen");
}
catch (FileNotFoundException e) {
Log.e("Error", e + "");
}
catch (Exception e) {
Log.e("Error", e + "");
}
Can you give more information as to what does not work when you run that code ? Does it not capture what you want ? Does it crash ?
Make sure you change the R.id.layoutroot correctly with your root layout... Beside that it seems like it would work...
<com.example.android.snake.SnakeView
android:id="#+id/snake"
android:layout_width="match_parent"
android:layout_height="match_parent"
tileSize="24"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="#+id/text"
android:text="#string/snake_layout_text_text"
android:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center_horizontal"
android:textColor="#ff8888ff"
android:textSize="24sp"/>
</RelativeLayout>
Edit...
So for example, if you use that layout you just put there, you should change the R.id.layout into R.id.snake, that's because of this line : android:id="#+id/snake".
I don't think there is an easy way to find /get the id of the "root" layout of a view (if you wanted to take screenshot of anything the phone is showing.
I just checked the launcher and another application, seems like most app are placed into a FrameLayout with id/content, so you can try to use android.R.id.content, but there is no guaranty this will work every time...

Categories

Resources