Android 位图共享意图
我正在尝试将整个CardView转换为图像,然后我想使用不同的应用程序共享它 问题Android 位图共享意图,android,android-intent,bitmap,Android,Android Intent,Bitmap,我正在尝试将整个CardView转换为图像,然后我想使用不同的应用程序共享它 问题 cardView.setDrawingCacheEnabled(true); cardView.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpe
cardView.setDrawingCacheEnabled(true);
cardView.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));
cardView.layout(0,0, cardView.getMeasuredWidth(), cardView.getMeasuredHeight());
cardView.buildDrawingCache(true);
bitmap = Bitmap.createBitmap(cardView.getDrawingCache());
cardView.setDrawingCacheEnabled(false);
String path = MediaStore.Images.Media.insertImage(DetailedActivity.this.getContentResolver(),bitmap,"quote",null);
uri = Uri.parse(path);
问题是,我正在将cardview转换为位图,但在从位图获取uri时,它返回空路径。所以,在转换Uri时,它给出了空指针异常
下面是我提供的权限列表
在上面显示的代码中,它给出了NULL\u指针\u异常
查询
一,。我怎样才能让它工作
二,。有没有其他方法可以做到这一点?因此,如果我没有弄错,URI路径存储在URI变量中。发生空错误是因为您没有初始化该uri字符串。您可以这样做:
String uri = new String() // -> if there is still an error here, replace String() with String(this) or String(activity_your_name.this)
Intent intent = new Intent(this, activity_output.class); // -> here you add the activity where you send the URI to
intent.putExtra("URI", uri);
在其他活动中,您可以通过以下方式提取URI:
//Getting the URI from previous activity:
path = getIntent().getExtra("URI");
//Initialising the File form your URI
File StringToBitmap = new File;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
StringToBitmap = new File(path, String.valueOf(options));
//Your bitmap will be stored in mBitmaps
mBitmaps = BitmapFactory.decodeFile(path);
//The next part is extra, if you want to display your bitmap into an ImageView
ImageView iv = new ImageView();
iv = findViewById(R.id.your_id);
iv.setImageBitmap(mBitmaps);
这段代码对我的作用非常类似。关于这个空异常,每次你得到它时,试着看看你是否正确初始化了所有的对象。希望这有帮助。试试这个:
public Bitmap getScreenShot(View view) {
view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
return bitmap;
}
public void onShareImage(Bitmap bitmap) {
@SuppressLint("SimpleDateFormat") String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".PNG";
storeScreenShot(bitmap, fileName);
Uri imgUri = Uri.fromFile(new File(VarName.SCREENSHOT_DIRECTORY + "/" + fileName));
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
shareIntent.putExtra(Intent.EXTRA_TEXT, VarName.DRESS_ME_SHARE_MASSAGE_HEADER + "\n" + VarName.DRESS_ME_SHARE_APP_LINK);
startActivity(Intent.createChooser(shareIntent, "Share Image"));
}
public void storeScreenShot(Bitmap bm, String fileName) {
File dir = new File(VarName.SCREENSHOT_DIRECTORY);
if (!dir.exists()) {
dir.mkdirs();
File file = new File(dir.getAbsolutePath(), ".nomedia");
try {
file.createNewFile();
final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
final Uri contentUri = Uri.fromFile(file);
scanIntent.setData(contentUri);
sendBroadcast(scanIntent);
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File(VarName.SCREENSHOT_DIRECTORY, fileName);
try {
FileOutputStream fOut = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
file.createNewFile();
final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
final Uri contentUri = Uri.fromFile(file);
scanIntent.setData(contentUri);
sendBroadcast(scanIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
现在您只需要调用函数
Bitmap bitmap = getScreenShot(cardView);
onShareImage(bitmap);
它的宽度和高度分别返回1158和304。我猜你搞错了。在每种情况下,我都会得到这些值,但在每种情况下,我也会得到path NULL。
public Bitmap getScreenShot(View view) {
view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
return bitmap;
}
public void onShareImage(Bitmap bitmap) {
@SuppressLint("SimpleDateFormat") String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".PNG";
storeScreenShot(bitmap, fileName);
Uri imgUri = Uri.fromFile(new File(VarName.SCREENSHOT_DIRECTORY + "/" + fileName));
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
shareIntent.putExtra(Intent.EXTRA_TEXT, VarName.DRESS_ME_SHARE_MASSAGE_HEADER + "\n" + VarName.DRESS_ME_SHARE_APP_LINK);
startActivity(Intent.createChooser(shareIntent, "Share Image"));
}
public void storeScreenShot(Bitmap bm, String fileName) {
File dir = new File(VarName.SCREENSHOT_DIRECTORY);
if (!dir.exists()) {
dir.mkdirs();
File file = new File(dir.getAbsolutePath(), ".nomedia");
try {
file.createNewFile();
final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
final Uri contentUri = Uri.fromFile(file);
scanIntent.setData(contentUri);
sendBroadcast(scanIntent);
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File(VarName.SCREENSHOT_DIRECTORY, fileName);
try {
FileOutputStream fOut = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
file.createNewFile();
final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
final Uri contentUri = Uri.fromFile(file);
scanIntent.setData(contentUri);
sendBroadcast(scanIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
Bitmap bitmap = getScreenShot(cardView);
onShareImage(bitmap);