我使用套接字作为MediaPlayer的代理,因此可以在将mp3音频写入套接字之前下载并解密。 这类似于NPR新闻应用程序中显示的示例,但是我将其用于所有Android版本2.1-4 atm。
NPR StreamProxy代码-[http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java]
我的问题是,对于2.1-2.3而言,播放速度很快,但是在Android 4.0 ICS中,MediaPlayer在触发onPrepared侦听器之前会缓冲太多数据。
在onPrepared()之前写入Socket OutputStream的数据量示例:
在具有2.3.4的SGS2上-约133920字节后的onPrepared()
在使用4.0.4的Nexus S上-约961930字节后的onPrepared()
这也发生在Galaxy Nexus上。
奇怪的是4.0仿真器不像4.0设备那样缓冲太多的数据。 任何人在ICS上遇到MediaPlayer的类似问题?
编辑
这是代理写入套接字的方式。 在此示例中,它是从文件加载的CipherInputStream中获得的,但是从HttpResponse中加载它的情况相同。
final Socket client = (setup above)
// encrypted file input stream
final CipherInputStream inputStream = getInputStream(file);
// setup the socket output stream
final OutputStream output = client.getOutputStream();
// Writing the header
final String httpHeader = buildHttpHeader(file.length());
final byte[] buffer = httpHeader.getBytes("UTF-8");
output.write(buffer, 0, buffer.length);
int writtenBytes = 0;
int readBytes;
final byte[] buff = new byte[1024 * 12]; // 12 KB
while (mIsRunning && (readBytes = inputStream.read(buff)) != -1) {
output.write(buff, 0, readBytes);
writtenBytes += readBytes;
}
output.flush();
output.close();
在音频之前写入MediaPlayer的HTTP标头。
private String buildHttpHeader(final int contentLength) {
final StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 200 OK\r\n");
sb.append("Content-Length: ").append(contentLength).append("\r\n");
sb.append("Accept-Ranges: bytes\r\n" );
sb.append("Content-Type: audio/mpeg\r\n");
sb.append("Connection: close\r\n" );
sb.append("\r\n");
return sb.toString();
}
我四处寻找替代实现,但是由于我已经加密了音频并且MediaPlayer不支持InputStreams作为数据源,所以我唯一的选择(我认为..)是使用诸如此类的代理。
同样,这在Android 2.1-2.3上运行良好,但在ICS中,MediaPlayer在播放之前会缓冲大量此类数据。
编辑2:
进一步的测试表明,一旦升级到Android 4.0.3,这在SGS2上也是一个问题。 因此,似乎MediaPlayer的缓冲实现在4.0中已发生了显着变化。 由于API无法提供任何更改行为的方式,因此令人沮丧。
编辑3:
已创建Android错误。 请添加评论并在其中加注星标[http://code.google.com/p/android/issues/detail?id=29870]
编辑4:
我的播放代码相当标准。.我在onPrepared()方法中对MediaPlayer进行了start()调用。
mCurrentPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mCurrentPlayer.setDataSource(url);
mCurrentPlayer.prepareAsync();
仅使用prepare()和ajacian81的推荐方法进行了尝试,但无济于事。
我应该补充一点,最近有一位Google员工回覆了我的问题,并确认ICS(用于HD内容)的缓冲区大小是有意增加的。 已要求API开发人员添加在MediaPlayer上设置缓冲区大小的功能。
尽管我认为这个API更改请求在我来之前就已经存在了,所以我不建议任何人屏住呼吸。
我在活动中启动服务,然后希望该服务在一段时间后自行停止。
我在服务中调用了stopSelf(),但是它不起作用。
如何使服务自行停止?
我通过应用程序(而不是服务)管理正在进行的通知。
当我用“结束”按钮从任务管理器中终止应用程序时,通知消失。
当我从多任务面板中删除应用程序时,应用程序被杀死,但仍保留通知。
我的问题是:
作为更新:
我所有的活动都通过以下方法扩展了MyActivity类(扩展了Activity):
@Override protected void onCreate(Bundle state) {
super.onCreate(state);
((MyApplication) getApplication()).onActivityCreate(this, state);
}
@Override protected void onDestroy() {
super.onDestroy();
((MyApplication) getApplication()).onActivityDestroy(this);
}
我的应用程序通过以下方法扩展了MyApplication类(扩展了Application):
private List<Activity> activities = new ArrayList<Activity>();
protected final void onActivityCreate(Activity activity, Bundle state) {
if(activities.isEmpty() && state == null) {
onStart();
}
activities.add(activity);
}
protected final void onActivityDestroy(Activity activity) {
activities.remove(activity);
if(activities.isEmpty() && activity.isFinishing()) {
onExit();
}
}
protected void onStart() {
// some code
}
protected void onExit() {
// some code
notificationManager.cancel(NOTIFICATION_ID);
}
activities
是所有正在运行的活动的列表
这不是最简单的机制,但我需要
我应该改用服务吗?
作为新的更新:
在我的onExit()方法中,如果我记录了调试消息以了解会发生以下情况:
public void onExit() {
for(int i = 0; i < 100; i++) {
Log.d(TAG, "onExit");
}
}
少量的日志每两个出现一次,而不是全部出现(例如:13/100)
因此,我知道从多任务面板删除应用程序会杀死应用程序,而无需等待关闭方法才能正确完成...但是为什么不处理呢?
我该如何强制终止?
如何在Android Studio IDE中找到项目中所有未使用的方法和变量?
从v4.1 Jelly Bean开始,Google为Google Play引入了新的应用程序资产加密功能。 似乎在升级应用程序时会出现一些问题,其中包括由于apk目录中的更改而导致重启后丢失的持久数据(旧版本为/data/app
,现在为/mnt/asec
)。
因此,在适用于OS 2.3+的Google Play上发布(或更新已发布的应用)时,
除了这个问题,提供额外的防止盗版保护的想法似乎还可以,但是我在文档中的任何地方都找不到一些其他注意事项:
提前致谢
更新:
编辑以包括指向Google Code问题的链接。
问题34880(已关闭,但仍有一些开发人员在抱怨;状态:未来版本)
发行35962(已关闭;状态:已发布)
更新#2:
在第一期中,由一名开发人员链接的有关此博客文章的有趣信息。 也是这里德语。
用户和开发人员报告说,在最近几天中,使用最新版本的Google Play(3.7.15)安装的应用程序问题似乎消失了。 先前已安装有问题的应用程序的用户将需要卸载,然后免费重新下载它们。 根据一份报告,新版本的Google Play现在将付费应用再次保存到/ data / app,这意味着Google现已停用了复制保护功能。 Google尚未对此问题发表公开评论。 该错误被标记为中等优先级,其状态为“ FutureRelease”(可能为修复)。
为了生成通知,我需要了解如何以编程方式生成电量不足和内存不足中断。 任何人都可以提供您的建议。我了解Intent。
我正在尝试提出一个请求,其中要包含一个Header,一个表单编码的字段和一个json主体。我的改装界面如下
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Field("grant_type") String grantType,
@Body RegisterBody body
);
当我发出此请求时,我得到异常@Body
的参数,不能与形式或多部分编码一起使用。
我也尝试使用IllegalArgumentException
批注:
@Multipart
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Part("grant_type") TypedString grantType,
@Body RegisterBody body
);
我得到IllegalArgumentException
,并且只允许一个编码注释。
当我在稳定频道中将Android Studio更新为3.0并运行该项目时,我开始收到以下错误消息。
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
我尝试清理和重建项目,但是没有成功。 任何帮助将不胜感激。
项目级别build.gradle
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.google.gms:google-services:3.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
应用程序级别build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.med.app"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
resConfigs "auto"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
//appcompat libraries
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support:design:26.1.0'
//butterknife
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//picasso
compile 'com.squareup.picasso:picasso:2.5.2'
//material edittext
compile 'com.rengwuxian.materialedittext:library:2.1.4'
// Retrofit & OkHttp & and OkHttpInterceptor & gson
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
// FirebaseUI for Firebase Auth
compile 'com.firebaseui:firebase-ui-auth:3.1.0'
}
apply plugin: 'com.google.gms.google-services'
我已经尝试了所有给出的答案,但无法解决此错误。 请帮忙。
我看过很多例子,它们似乎都以不同的方式解决了这个问题。 基本上,我只是想要最简单的方法来发出不会锁定主线程并且可以取消的请求。
这也无济于事,我们至少有2个HTTP库可供选择,它们分别是java.net。*(例如HttpURLConnection)和org.apache.http。*。
最佳实践是什么?
我是Android的新手,我确实需要这样做(我已经考虑过在另一个Activity
中这样做),但是谁能给我看一个简单的代码(仅3007499213031867397392方法),而无需ListActivity
就能完成Listview
?
谢谢
当用户滚动到底部时,我正在使用OnScrollListener将项目动态添加到ListView。 在将数据添加到适配器并尽管调用了notifyDataSetChanged之后,ListView回到顶部。 理想情况下,我想保留在ListView中的位置。 关于我应该如何做的任何想法?
我有一个应用程序,实现了推送通知。
我想了解实施GCM时需要“ GET_ACCOUNTS”(android.permission.GET_ACCOUNTS)的原因吗? 一些用户对此许可提出了担忧。 我已经在清单中使用了此许可权,如此处的官方网站所给。
此权限的安全性如何? 如果我从清单中删除了它,推送通知是否有效?
我已经搜索过,但没有找到针对我的具体情况的任何疑问或答案。 我有一台运行速度很快的新机器,它具有运行Windows 7的大量内存。我正在使用最新的Eclipse和Android SDK。
从运行启动到运行我的应用程序,模拟器运行大约需要45秒钟(对于模拟器而言,这真是太快了!)。
如果然后我更改应用程序并在仍在运行的模拟器上重新运行它,则时间将增加到70多秒! 与人们的所有其他投诉相反,就我而言,重新启动模拟器比使用现有实例要快。 我不喜欢
这是时间:
2011-09-29 13:07:13 - hello Uploading hello.apk onto device 'emulator-5554'
2011-09-29 13:07:18 - hello Installing hello.apk...
2011-09-29 13:07:37 - hello Success!
在更改应用程序以使其重新加载后运行:
2011-09-29 13:08:18 - hello Uploading hello.apk onto device 'emulator-5554'
2011-09-29 13:09:16 - hello Installing hello.apk...
2011-09-29 13:09:24 - hello Success!
如您所见,重新启动仿真器后,上传到仿真器仅需5秒钟。 正在运行的模拟器需要将近一分钟! 这是延长重新运行时间的原因。 即使我在重新运行它之前在模拟器上卸载该应用程序,这也不会改变。
关于我可以尝试解决的任何想法? 它似乎是某种通信问题,可能与adb有关。
我刚刚将Android Studio更新为0.6.0,并将SDK生成工具更新为19.1.0,但是出现了以下错误:
The SDK Build Tools revision (19.0.3) is too low. Minimum required is 19.1.0
如何强制它使用SDK Build Tools 19.1.0? 我尝试删除19.0.3,但没有帮助。
[ 75364] WARN - nal.AbstractExternalSystemTask - The SDK Build Tools revision (19.0.3) is too low. Minimum required is 19.1.0
com.intellij.openapi.externalSystem.model.ExternalSystemException: The SDK Build Tools revision (19.0.3) is too low. Minimum required is 19.1.0
at org.jetbrains.plugins.gradle.service.project.AbstractProjectImportErrorHandler.createUserFriendlyError(AbstractProjectImportErrorHandler.java:106)
at org.jetbrains.plugins.gradle.service.project.BaseProjectImportErrorHandler.getUserFriendlyError(BaseProjectImportErrorHandler.java:153)
at org.jetbrains.plugins.gradle.service.project.BaseGradleProjectResolverExtension.getUserFriendlyError(BaseGradleProjectResolverExtension.java:352)
at com.android.tools.idea.gradle.project.AndroidGradleProjectResolver.getUserFriendlyError(AndroidGradleProjectResolver.java:334)
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver$ProjectConnectionDataNodeFunction.fun(GradleProjectResolver.java:364)
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver$ProjectConnectionDataNodeFunction.fun(GradleProjectResolver.java:330)
at org.jetbrains.plugins.gradle.service.project.GradleExecutionHelper.execute(GradleExecutionHelper.java:203)
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.resolveProjectInfo(GradleProjectResolver.java:116)
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.resolveProjectInfo(GradleProjectResolver.java:64)
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl$1.produce(RemoteExternalSystemProjectResolverImpl.java:41)
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl$1.produce(RemoteExternalSystemProjectResolverImpl.java:37)
at com.intellij.openapi.externalSystem.service.remote.AbstractRemoteExternalSystemService.execute(AbstractRemoteExternalSystemService.java:59)
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl.resolveProjectInfo(RemoteExternalSystemProjectResolverImpl.java:37)
at com.intellij.openapi.externalSystem.service.remote.wrapper.ExternalSystemProjectResolverWrapper.resolveProjectInfo(ExternalSystemProjectResolverWrapper.java:49)
at com.intellij.openapi.externalSystem.service.internal.ExternalSystemResolveProjectTask.doExecute(ExternalSystemResolveProjectTask.java:48)
at com.intellij.openapi.externalSystem.service.internal.AbstractExternalSystemTask.execute(AbstractExternalSystemTask.java:137)
at com.intellij.openapi.externalSystem.service.internal.AbstractExternalSystemTask.execute(AbstractExternalSystemTask.java:123)
at com.intellij.openapi.externalSystem.util.ExternalSystemUtil$2.execute(ExternalSystemUtil.java:406)
at com.intellij.openapi.externalSystem.util.ExternalSystemUtil$3$2.run(ExternalSystemUtil.java:483)
at com.intellij.openapi.progress.impl.ProgressManagerImpl$TaskRunnable.run(ProgressManagerImpl.java:471)
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171)
at com.intellij.openapi.progress.impl.ProgressManagerImpl$8.run(ProgressManagerImpl.java:380)
at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:149)
[ 75373] WARN - .project.GradleProjectImporter -
我需要使用自定义视图制作AlertDialog
。AlertDialog
的消息具有默认填充,但是当我设置一个视图时,它没有填充,因此我希望获得与消息相同的默认填充。 我使用的是扩展Holo主题的样式(如果相关)。
AlertDialog.Builder builder = new AlertDialog.Builder(PlaylistListView.this.getContext());
builder.setTitle("Title");
builder.setView(inflate(context, R.layout.music_player_create_dialog, null));
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();
这是内容的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/abc_dialog_padding_material"
android:paddingRight="@dimen/abc_dialog_padding_material"
android:paddingTop="@dimen/abc_dialog_padding_top_material"
android:paddingBottom="@dimen/abc_dialog_padding_top_material">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title:"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:background="@null"
android:layout_marginTop="20dp"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/divider"/>
</LinearLayout>
在我的项目中,我获得了json格式的API响应。 我得到UTC时间格式的时间的字符串值,例如Jul 16, 2013 12:08:59 AM
。
我需要将其更改为本地时间。那就是我们使用此应用程序需要显示当地时间的地方。 我该怎么做?
这是我尝试过的一些代码:
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);
假设日期包含Jul 16, 2013 12:08:59 AM
通过多活动应用程序流束缚Google+ api客户端生命周期的一种好/推荐方法是什么? 使活动依赖于onConnected api客户端方法来触发其功能,将其用作一次性的“激活”事物,或者完全用作其他事物?
我目前正在努力了解如何在我的Android应用中正确使用Google+登录,该应用有多个活动。
这个想法是,在第一个阶段中,使用G +登录仅用于验证用户身份并能够获取她的电子邮件,发送通知和类似内容。 最终,我计划推出其他Google功能,例如Maps或其他Google Play服务,因此我认为已经非常有用。
但是,我的应用程序运行不正常,因此我将问题缩小到以下事实:当存在多个活动时,我还不了解应用程序周期中的G +登录。
实现此auth方法的正确或推荐方法是什么? 也许有某种模式可以指导我朝正确的方向发展吗?
例如,我发现了一个非常简单的api客户端生命周期图,但这与应用程序流程有何关系?
最初,我有一个登录活动,在其中输入了登录按钮。 按照Google的指南,我可以登录,并在调用onConnected方法时,启动“家庭活动”(有点像仪表板或应用程序的主屏幕)。
这有点奏效。 例如,为每个活动处理onStart和onStop的好方法是什么? 我应该为每个活动每次都重新连接和重新认证api客户端吗? 因此,拥有BaseActivity来实现所有这些可能是一个好主意。
另一个问题是,我应该使用相同的api客户端对象并以某种方式传递它,还是将其存储在Base Activity类中? 还是应该每次都创建和初始化一个新的api客户端对象?
仅使用登录活动对G +进行身份验证,然后获取电子邮件并将其存储在本地数据库中,然后将用户标记为“已认证”或“活动”或类似内容,该怎么办? 这样可以避免我每次关闭应用程序或暂停连接时都必须重新进行身份验证,甚至节省了一些电池电量。
该应用并未真正使用Google+发布或类似的其他功能。 理想情况下,它应该可以在脱机状态下正常运行,并且只需要连接即可进行初始身份验证之类的东西或其他一次性的东西。
我们非常感谢您在正确方向上提出的任何建议或指示。
编辑:我已经阅读了所有可以找到的使用Google+的指南和教程,并且每个人都从一个活动角度解决了这个问题。 我认为这是一个足够普遍的问题,它将从某种模式或至少是一条通用准则中受益。
我想在项目中使用自定义组件,并且要将其添加到如下所示的枚举属性中,我该怎么做?
<com.abb.abbcustomcompanents.buttons.AbbButton
android:id="@+id/abbBtn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:Type="How can i use enum here"
/>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="abbButton">
<attr name="Type" format="enum"/>
<attr name="onAction" format="string"/>
</declare-styleable>
</resources>
谢谢 !
我正在尝试在当前活动之上放置一层,以解释当前屏幕上正在发生的事情,类似于contact + app上发生的事情。
我知道有一些解决方案(例如showCase库和superToolTips库),并且我也知道可以通过将其添加到活动窗口中来创建视图并将其设置在顶部,但是我需要将整个视图 对话框顶部。
无论我尝试什么,每种解决方案都无法按我需要的方式工作。
简而言之,我需要的是:
全屏对话框。
动作栏,通知栏和后面活动的内容没有变化(视觉上和逻辑上没有变化),这意味着对话框后面的所有内容与显示对话框之前的相同。
除了我用于对话框的视图(应该正常显示)以外,其他视图都是透明的。
可悲的是,我总是只得到我需要的东西的一部分。
这是我的代码:
styles.xml:
<style name="full_screen_dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>
main activity.Java:
...
final Dialog dialog = new Dialog(this, R.style.full_screen_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.floating_tutorial);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT);
dialog.show();
这段代码会将布局放在活动的顶部,但是遗憾的是,即使我已经设置了透明度,它也没有任何透明度。 我使用的布局非常简单,这就是为什么我不发布它的原因。
我想念什么? 应该怎么做才能修复代码?
如何使对话框既透明又全屏,并且不会更改操作栏和通知栏。
编辑:找到一个好的解决方案后,这是工作代码:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.floating_tutorial);
final Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}