- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于用Adobe AIR编写的游戏,当我们在Android上显示本地或推送通知时,我们希望游戏中的声音之一成为通知声音。
目前,我们有以下解决方案,我们对此并不满意,因为它需要额外的Android权限,而我们确实认为这是不必要的。基本上,您传递 Assets 路径,例如位于根“assets”文件夹中的“audio / core / reward.mp3”,然后在Android端,将文件拉出到InputStream中,并将其写入文件在外部存储设备上,Android的MediaPlayer从那里开始播放。
显然,当您在Android上播放文件时,这一定不是AIR所做的,因为您不需要“WRITE_EXTERNAL_STORAGE”来播放声音,因此对于我们来说,当应用程序当前未在积极运行时,会出现推送通知在其中,我将如何播放在AS3方面打包和使用的文件?
推荐的方法是
MediaPlayer m = new MediaPlayer();
AssetFileDescriptor afd = context.getAssets().openFd(soundPath);
m.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
m.prepare();
m.setVolume(1f, 1f);
m.start();
playSound = false;
java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
public static void HandleMessage(Context context, CharSequence title, CharSequence message, String soundPath)
{
log("HandleMessage (message: '" + message + "', title: '" + title +"', icon: " + Extension.getIcon(context) + ", class: " + Extension.getEntryClass(context));
long when = System.currentTimeMillis();
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent notificationIntent = new Intent(context, Extension.getEntryClass(context));
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(context)
.setContentText(message)
.setContentIntent(contentIntent)
.setTicker(message)
.setSmallIcon(Extension.getIcon(context))
.setWhen(when)
.setAutoCancel(true)
.setVibrate(new long[] { 1000, 400 })
.build();
Boolean playSound = true;
if(null != soundPath && "" != soundPath)
{
try {
MediaPlayer m = new MediaPlayer();
String newPath = checkWriteFile(context, soundPath);
log(newPath);
if(null != newPath)
{
m.setDataSource(newPath);
m.prepare();
m.setVolume(1f, 1f);
m.start();
playSound = false;
}
} catch (IOException e) {
log(e.getLocalizedMessage());
e.printStackTrace();
}
}
if(playSound)
{
notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
}
nm.notify(NotifId, notification);
NotifId++;
}
public static String checkWriteFile(Context context, String relPath)
{
Boolean exists = false;
String newPath = null;
String fullPath = Environment.getExternalStorageDirectory().getPath() + "/" + context.getPackageName() + "/temp/" + relPath;
int index = fullPath.lastIndexOf("/") + 1;
String file = fullPath.substring(index);
String path = fullPath.substring(0, index);
log(relPath + ", " + fullPath + ", " + (new File(fullPath)).exists());
if (!(new File(fullPath)).exists()) {
try {
byte[] buffer = null;
InputStream fIn = context.getAssets().open(relPath);
log("InputStream: " + fIn);
int size=0;
try {
size = fIn.available();
buffer = new byte[size];
fIn.read(buffer);
fIn.close();
} catch (IOException e) {
e.printStackTrace();
}
exists = (new File(path)).exists();
if (!exists) {
new File(path).mkdirs();
}
FileOutputStream save;
try {
save = new FileOutputStream(path + file);
save.write(buffer);
save.flush();
save.close();
newPath = fullPath;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
catch (Exception e) {
log(e.getLocalizedMessage());
e.printStackTrace();
}
}
else {
newPath = fullPath;
}
return newPath;
}
最佳答案
如果要避免使用android.permission.WRITE_EXTERNAL_STORAGE
,可以将文件提取到内部存储中,而不是外部。
String fullPath = Environment.getExternalStorageDirectory() (...)
String fullPath = context.getFilesDir() (...)
关于android - Android-从没有android.permission.WRITE_EXTERNAL_STORAGE的 Assets 中播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044967/
当拥有 WRITE_EXTERNAL_STORAGE 权限时,我希望有权写入整个文件系统(例如 /sdcard、/storage/emulated/0 ,/storage/sdcard0,/mnt/s
我正在将我的 Android 应用程序的目标 SDK 版本升级到 23 (Android M),它具有新的运行时权限 (https://developer.android.com/training/p
我想要的只是能够在一个非常特定的文件夹(与我的应用程序相关)中为我的应用程序编写日志/异常报告,以便了解失败和异常,所以这是我正在使用的代码: File logFile = new File(Envi
正在关注 this discussion ,我已经签署了一个系统应用程序,我正在使用从制造商那里收到的特定设备的专有平台证书。我签名如下: java -jar out/host/linux-x86/f
据我所知,要将声音设置为铃声,应将其插入 MediaStore。在 MediaStore 中写入,需要 WRITE_EXTERNAL_STORAGE 权限。但是...有没有办法在不需要 WRITE_E
下面的代码输出是“Write granted”,但之后出现错误 '/storage/emulated/0/Download/test.txt: open failed: EACCES (Permiss
是否可以在不添加任何权限的情况下共享自己的应用程序屏幕截图? 这是我的其他应用程序代码,用于复制到缓存和共享 public void sendFile(File paramFile) {
我开始将 HERE Android Starter SDK 集成到我的应用程序中。根据文档(和运行时错误),初始化 MapEngine 需要权限 WRITE_EXTERNAL_STORAGE: Map
我有使用的应用程序 它在 Android 6.0 上自动授予,但我可以在设置中撤销它。想要检查它是否被授予以防用户撤销它,所以我这样做: int permissionCheck = ContextC
如 documentation 中所述,从 API 级别 19 开始,WRITE_EXTERNAL_STORAGE 权限不应该是必需的。因此,我已将其写入 list : 但是,当我运行使用 Goog
有没有一种方法可以使用 Intent.ACTION_SEND 来共享屏幕截图而不需要 android.permission.WRITE_EXTERNAL_STORAGE? 分享部分如下: In
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个 android 应用程序需要以下权限才能运行。 ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、WRITE_EXTERNAL_STORAGE、RECORD_AU
安卓 6 我编写了下一个检查权限的代码,如果没有这样的权限,它会要求用户提供它们。 private void checkDiskPermission () { if (ActivityComp
我目前使用此方法有效地将图像文件转换为内容 uri... protected static Uri convertFileToContentUri(Context context, File file
我正在使用下载管理器下载文件并将其保存到外部存储,如下所示: DownloadManager.Request req = new DownloadManager.Request(uri); req.s
在 android 6 或更高版本中,当用户第一次打开应用时询问他一些权限如果他不允许则退出应用程序 我的应用程序必须有一些权限是读取和写入外部存储,如何实现这一点 我试过了 if (Build.VE
声明就够了吗?还是我也必须声明 ? Javadocs 省略了这一重要信息。 最佳答案 最好是显式地声明这两个权限,但仅声明 android.permission.WRITE_EXTERNAL_STOR
我使用 DownloadManager 下载照片并将其保存到外部图片目录: .setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTU
AS 中有一个关于 android.permission.WRITE_EXTERNAL_STORAGE 的 lint 警告.警告说,当面向 Android 10 及更高版本时,该权限将不再提供写入权限
我是一名优秀的程序员,十分优秀!