最近想给一个APP添加分享屏幕截图的功能,就尝试找了一圈相关的Package,最后找倒是没找到,倒是在StackOverflow找到了一个解决方法。
布局及相关权限
- AndroidManifest.xml权限添加
<!-- STORAGE PERMISSION FOR SCREEN SHOT-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 存储路径配置
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>
- 布局
...
<LinearLayout android:id="@+id/shared_preferences_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#7E03A9F4">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAlignment="center"
android:layout_weight="10"
android:text="@string/share_info"/>
<Button android:id="@+id/share"
android:background="@drawable/ic_share"
android:layout_weight="1"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginRight="10dp"/>
</LinearLayout>
...
Code
- 主要引用
...
Button share = (Button) findViewById(R.id.share);
share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bitmap bitmap = takeScreenshot(gameWeb);
saveBitmap(bitmap);
shareIt(GameActivity.this);
}
});
...
- 截图
public Bitmap takeScreenshot(View v) {
View rootView = findViewById(android.R.id.content);
Bitmap bitmap = Bitmap.createBitmap(rootView.getWidth(),
rootView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
rootView.draw(canvas);
return bitmap;
}
- 存图
public void saveBitmap(Bitmap bitmap) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddhhmmss");
imagePath = new File(Environment.getExternalStorageDirectory() + "/DCIM/Share_"+ft.format(dNow)+".png");
if (!imagePath.exists()) {
Log.d("path", imagePath.toString());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(imagePath);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
Log.e("GREC", e.getMessage(), e);
} catch (java.io.IOException e) {
e.printStackTrace();
Log.e("GREC", e.getMessage(), e);
}
}
}
- 分享
private void shareIt (Context context){
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", imagePath);
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("image/*");
String shareBody = getString(R.string.shareBody);
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.Score));
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_via)));
}