如何将位图保存在缓存中并从缓存中共享?
How to save a bitmap in and share from cache?
我有一种方法可以将来自应用程序的位图与第 3 方社交媒体应用程序共享。我正在尝试 将我的位图保存到缓存文件夹并从那里共享。这是我的方法:
public void shareMeme(Bitmap bitmap) {
String path = Objects.requireNonNull(getContext()).getCacheDir().getAbsolutePath();
Uri uri = Uri.parse(path);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));
Toast.makeText(getContext(), "The Cache drive is: " + path, Toast.LENGTH_LONG).show();
}
该方法通过其参数从另一个方法获取位图。我想知道如何将 shareMeme(Bitmap bitmap)
参数与上述代码合并。
更新
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.omar.memegenerator">
...
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.omar.memegenerator.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
...
</application>
</manifest>
新的shareMeme(Bitmap bitmap)
方法:
public void shareMeme(Bitmap bitmap) {
String path = Objects.requireNonNull(getContext()).getCacheDir().getAbsolutePath();
File file = new File(path + "/Memes/" + timeStamp + counter + ".jpg");
Uri uri = FileProvider.getUriForFile(getContext(), "com.example.omar.memegenerator.fileprovider", file);
try {
OutputStream stream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));
Toast.makeText(getContext(), "The Cache drive is: " + path, Toast.LENGTH_LONG).show();
}
堆栈跟踪:
2019-04-09 05:08:51.324 19288-19288/com.example.omar.memegenerator E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.omar.memegenerator, PID: 19288
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.omar.memegenerator/cache/Memes/201904090.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:418)
at com.example.omar.memegenerator.TopImageFragment.shareMeme(TopImageFragment.java:232)
at com.example.omar.memegenerator.TopImageFragment.onReceive(TopImageFragment.java:303)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313)
at android.support.v4.content.LocalBroadcastManager.handleMessage(LocalBroadcastManager.java:121)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
第 1 步:在 Bitmap
上使用 compress()
将其保存到 getCacheDir()
中的文件
第 2 步:将 FileProvider
添加到您的项目,配置为提供来自 getCacheDir()
的文件
第 3 步:使用 FileProvider.getUriForFile()
而不是您现有的代码来获取 Uri
以放入 EXTRA_STREAM
第 4 步:在调用 startActivity()
之前将 Intent.FLAG_GRANT_READ_URI_PERMISSION
添加到 Intent
,以便收件人有权访问您的内容
我有一种方法可以将来自应用程序的位图与第 3 方社交媒体应用程序共享。我正在尝试 将我的位图保存到缓存文件夹并从那里共享。这是我的方法:
public void shareMeme(Bitmap bitmap) {
String path = Objects.requireNonNull(getContext()).getCacheDir().getAbsolutePath();
Uri uri = Uri.parse(path);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));
Toast.makeText(getContext(), "The Cache drive is: " + path, Toast.LENGTH_LONG).show();
}
该方法通过其参数从另一个方法获取位图。我想知道如何将 shareMeme(Bitmap bitmap)
参数与上述代码合并。
更新
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.omar.memegenerator">
...
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.omar.memegenerator.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
...
</application>
</manifest>
新的shareMeme(Bitmap bitmap)
方法:
public void shareMeme(Bitmap bitmap) {
String path = Objects.requireNonNull(getContext()).getCacheDir().getAbsolutePath();
File file = new File(path + "/Memes/" + timeStamp + counter + ".jpg");
Uri uri = FileProvider.getUriForFile(getContext(), "com.example.omar.memegenerator.fileprovider", file);
try {
OutputStream stream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));
Toast.makeText(getContext(), "The Cache drive is: " + path, Toast.LENGTH_LONG).show();
}
堆栈跟踪:
2019-04-09 05:08:51.324 19288-19288/com.example.omar.memegenerator E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.omar.memegenerator, PID: 19288
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.omar.memegenerator/cache/Memes/201904090.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:418)
at com.example.omar.memegenerator.TopImageFragment.shareMeme(TopImageFragment.java:232)
at com.example.omar.memegenerator.TopImageFragment.onReceive(TopImageFragment.java:303)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313)
at android.support.v4.content.LocalBroadcastManager.handleMessage(LocalBroadcastManager.java:121)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
第 1 步:在 Bitmap
上使用 compress()
将其保存到 getCacheDir()
第 2 步:将 FileProvider
添加到您的项目,配置为提供来自 getCacheDir()
第 3 步:使用 FileProvider.getUriForFile()
而不是您现有的代码来获取 Uri
以放入 EXTRA_STREAM
第 4 步:在调用 startActivity()
之前将 Intent.FLAG_GRANT_READ_URI_PERMISSION
添加到 Intent
,以便收件人有权访问您的内容