小编Jon*_*n G的帖子

Facebook Android SDK 3.5中的自定义Facebook登录按钮图像

与Facebook Android SDK 3.0相关的问题类似于...

是否可以在SDK 3.5中使用我自己的图像作为Facebook登录按钮,而无需自定义SDK本身?

使用链接问题中给出的答案:

<com.facebook.widget.LoginButton
    xmlns:fb="http://schemas.android.com/apk/res-auto"
    android:id="@+id/login_button"
    android:layout_width="249dp"
    android:layout_height="45dp"
    android:layout_above="@+id/textView1"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="30dp"
    android:layout_marginTop="30dp"
    android:contentDescription="@string/login_desc"
    android:scaleType="centerInside"
    fb:login_text=""
    fb:logout_text="" />
Run Code Online (Sandbox Code Playgroud)

和:

final LoginButton button = (LoginButton) findViewById(R.id.login_button);
button.setBackgroundResource(R.drawable.facebook);
Run Code Online (Sandbox Code Playgroud)

我看到两个带有新SDK的图像.我的图像(R.drawable.facebook)是一个带有白色"f"的大灰色背景.但是,我也看到小白色背景和透明的"f"来自覆盖在背景顶部的原始facebook按钮图标.查看与SDK 3.5登录按钮相关的facebook文档.我想完全删除原来的facebook图标.

android facebook-android-sdk

17
推荐指数
1
解决办法
1万
查看次数

Android深层链接 - 后台堆栈

我正在尝试在我的Android应用程序中实现深层链接.我一直在关注这个指南.我在Android清单中启动了Android活动并进行了intent-filter:

<activity
    android:name=".MyActivity"
    android:parentActivityName=".MainActivity" >
    <intent-filter android:label="@string/filter_title_deep_link">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="com.example" />
    </intent-filter>
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity"/>
</activity>
Run Code Online (Sandbox Code Playgroud)

我从adb产生这个意图:

adb shell am start -W -a android.intent.action.VIEW -d "com.example://test" com.example
Run Code Online (Sandbox Code Playgroud)

正在使用正确的意图数据创建活动,并按预期运行.但是,按下后退按钮后,应用程序退出.MainActivity正如parentActivityNameAndroid清单中所指出的那样,我期待构建后备栈.显然事实并非如此.

在这种情况下,如何将父活动添加到后台堆栈?

我想,如果我可以使用一个TaskStackBuilder如图所示这里在通知的情况下,但不知道它是如何工作的.

也许我应该有一个中间Activity来构建主要活动,例如:

TaskStackBuilder.create(this)
                .addParentStack(MyActivity.class)
                .addNextIntent(new Intent(this, MyActivity.class))
                .startActivities();
Run Code Online (Sandbox Code Playgroud)

android deep-linking android-intent android-activity back-stack

15
推荐指数
3
解决办法
7447
查看次数

Gunicorn 使用 docker-compose 优雅地停止

我发现当我使用 docker-compose 关闭我的Gunicorn (19.7.1) python 应用程序时,总是需要 10 秒才能关闭。这是 docker-compose 在强制杀死进程之前等待的默认最大时间(通过-t / --timeout参数调整)。我认为这意味着gunicorn 没有被优雅地关闭。我可以用以下方法重现这个:

docker-compose.yml:

version: "3"
services:
  test:
    build: ./
    ports:
      - 8000:8000
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python

RUN pip install gunicorn

COPY test.py .

EXPOSE 8000
CMD gunicorn -b :8000 test:app
Run Code Online (Sandbox Code Playgroud)

测试.py

def app(_, start_response):
    """Simplest possible application object"""
    data = b'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])
Run Code Online (Sandbox Code Playgroud)

然后运行应用程序:

docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

并优雅地停止它:

docker-compose stop
Run Code Online (Sandbox Code Playgroud)

版本:

docker-compose …
Run Code Online (Sandbox Code Playgroud)

python gunicorn docker docker-compose

11
推荐指数
1
解决办法
3931
查看次数

YouTube Android API:YouTubePlayerFragment加载微调器

我正在使用Android YouTube API示例在我的应用中创建无格式的YouTube播放器.我有一个问题,即缓冲/加载进度条即使在加载并开始播放后也会继续显示在我的视频上.我可以FragmentDemoActivity通过几个小的修改在样本中重现这个:

public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragments_demo);

        YouTubePlayerFragment youTubePlayerFragment =
            (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
        youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this);
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
          boolean wasRestored) {
        if (!wasRestored) {
            player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
            player.loadVideo("nCgQDjiotG0", 10);
        }
    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {}

}
Run Code Online (Sandbox Code Playgroud)

我已经改为FragmentDemoActivity继承AppCompatActivity而不是YouTubeFailureRecoveryActivity,正如文档所说的那样好.我也改变了玩家的风格onInitializationSuccess.最后,我已经改变cueVideoloadVideo,只是触发自动播放.

这种情况发生在包括Nexus 5X在内的多种设备上.我正在使用库版本1.2.2.没有触发错误onInitializationFailure.

视频在缓冲后开始播放.该播放器是无铬的.然而,缓冲旋转器永远不会消失.这是一个错误,还是我在做一些我不允许做的事情?

youtube android youtube-api android-fragments android-youtube-api

9
推荐指数
1
解决办法
1655
查看次数

VideoView:MediaPlayer.getVideoWidth中的IllegalStateException

我有一个包含VideoView视频和播放列表的片段.它允许用户单击播放列表中的视频来交换内容VideoView.它还允许用户在每个视频周围寻找.在这里发布整个代码是不可行的,但我试图缩小问题,以便我可以添加一个示例.

我发现,如果我迅速改变其中的来源VideoView并寻求VideoView,我得到一个IllegalStateException:

W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x415fe8b0)
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.IllegalStateException
E/AndroidRuntime:     at android.media.MediaPlayer.getVideoWidth(Native Method)
E/AndroidRuntime:     at android.widget.VideoView$2.onPrepared(VideoView.java:346)
E/AndroidRuntime:     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2048)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:213)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5225)
E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

如您所见,我的任何代码都没有引用.如果我慢慢地执行相同的操作,我似乎没有相同的问题.从阅读如下问题:

调用MediaPlayer.reset()的IllegalStateException

http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

我假设当玩家处于无效状态时我正在执行动作,但我不知道该动作是什么.我MediaPlayer.OnErrorListener有一套VideoView,但我没有在日志中看到任何错误.我不叫resetreleaseVideoView任何点.

我用以下内容初始化播放器:

localPlayerVideoView = (VideoView) …
Run Code Online (Sandbox Code Playgroud)

video android media-player android-videoview

7
推荐指数
0
解决办法
991
查看次数

Android运行时执行与NetworkRequest

我在我的Android应用程序中运行命令行参数,如:

ProcessBuilder pb = new ProcessBuilder(cmds);
Process process = pb.start();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)

cmds要运行的参数列表在哪里.我的命令通过http连接探测远程URL.我的设备连接到无法访问互联网的WiFi网络,但确实托管了我想要探测的网址.我的设备也有一个可以访问互联网的蜂窝连接,但不能访问URL.我的设备运行的是Android 6.0 Marshmallow.

通常在Lollipop或更高版本中,Android默认使用连接到互联网的网络.要访问没有互联网的WiFi网络,您需要使用NetworkRequest,例如:https://stackoverflow.com/a/27958106/1847734.

我怎样才能将获得的内容传递Network给上面Process,以便连接通过我的WiFi网络,而不是我的蜂窝网络?

我是否需要使用ConnectivityManager#bindProcessToNetwork?如何使用此方法加入设置网络的过程?似乎没有选择给予这个过程.

connection networking android wifi android-6.0-marshmallow

7
推荐指数
1
解决办法
679
查看次数

适用于多个视频的YouTube Android播放器API INTERNAL_ERROR

使用Android版YouTube播放器API的示例代码(1.2.2版本),如果我改变任何视频的ID交给一个我已上载(例如,"QVikru_w2hQ"或"u1n6E81rm80"),在播放器缩略图加载,但在点击播放时,播放器使用YouTubePlayer.ErrorReason.INTERNAL_ERROR进入onError功能.将显示一条消息,说"播放时出现问题.点按即可重试".在YouTube网站或我们的iOS应用上播放这些视频没有问题.原始示例视频可以与我的开发人员密钥一起使用.

我在多个设备上遇到此问题,包括我的Nexus 5X(Android 6.0.1),其YouTube应用版本目前为11.13.56.

有没有其他人遇到过类似的问题?

我还在google data api问题跟踪器上发布了一个潜在的错误报告.

youtube android android-youtube-api

7
推荐指数
1
解决办法
1424
查看次数

YouTube API 3上传视频 - 未配置访问权限 - Android

我正在处理一款记录视频的Android应用,并允许用户使用YouTube Data API v3将其直接上传到YouTube.

我已经在Google的API控制台中设置了我的应用.在服务项下,我启用了YouTube Data API v3.在API访问下,我有一个"已安装应用程序的客户端ID"(包括客户端ID和客户端密钥)和"简单API访问"部分 - >"Android应用程序密钥(带证书)"(包括API密钥)和一个"Android应用程序"部分,暂时留空,即允许所有的Android应用程序,但我已经尝试设置我的Android密钥).

我的代码来自很多地方,主要是:

https://developers.google.com/youtube/v3/code_samples/java#upload_a_video

https://code.google.com/p/google-api-java-client/source/browse/tasks-android-sample/src/main/java/com/google/api/services/samples/tasks/android/ TasksSample.java?repo=samples

上传初始化OK,启动AsyncTask,但后来我抛出一个IOException:

{
    "code": 403,
    "errors": [
        {
            "domain": "usageLimits",
            "message": "Access Not Configured",
            "reason": "accessNotConfigured"
        }
    ],
    "message": "Access Not Configured"
}
Run Code Online (Sandbox Code Playgroud)

类似的SO帖子表明它与我的Google API控制台设置有关,但我找不到任何错误.有什么建议?我想知道是不是因为我没有在任何地方提供我的客户ID或秘密......

谢谢.

我的代码来自包含视频列表的片段.相关部分是:

- 在里面

public class UploadFragment extends Fragment {

    private static GoogleAccountCredential credential;
    private static final HttpTransport transport = AndroidHttp.newCompatibleTransport();
    private static final JsonFactory jsonFactory = new GsonFactory();
    public YouTube youtube;
    List<String> scopes = Lists.newArrayList(YouTubeScopes.YOUTUBE_UPLOAD);
    private static String VIDEO_FILE_FORMAT = …
Run Code Online (Sandbox Code Playgroud)

java upload android youtube-api android-youtube-api

6
推荐指数
1
解决办法
8309
查看次数

Google+登录 - 服务器端流程 - Python - Google App Engine

我正在使用Flask在Google App Engine上构建应用.我正在https://developers.google.com/+/web/signin/server-side-flow中描述的服务器端流程中实施Google+登录信息.在切换到App Engine之前,我的流程非常相似.也许从那以后我引入了一个错误.或者这可能是我在App Engine中实现的问题.

我相信通过Google登录流重定向的网址应该有一个GET参数设置为"gplus_id",但是,我没有收到此参数.

我有一个登录按钮创建:

(function() {
  var po = document.createElement('script');
  po.type = 'text/javascript'; po.async = true;
  po.src = 'https://plus.google.com/js/client:plusone.js?onload=render';
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(po, s);
})();

function render() {
  gapi.signin.render('gplusBtn', {
    'callback': 'onSignInCallback',
    'clientid': '{{ CLIENT_ID }}',
    'cookiepolicy': 'single_host_origin',
    'requestvisibleactions': 'http://schemas.google.com/AddActivity',
    'scope': 'https://www.googleapis.com/auth/plus.login',
    'accesstype': 'offline',
    'width': 'iconOnly'
  });
}
Run Code Online (Sandbox Code Playgroud)

在页面的javascript代码中,我有一个启动流程的功能:

var helper = (function() {
  var authResult = undefined;

  return {
    onSignInCallback: function(authResult) {
      if (authResult['access_token']) {
        // The user is signed in
        this.authResult = …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine oauth-2.0 google-plus

5
推荐指数
1
解决办法
1170
查看次数

在Python Cloud Datastore上放置实体一直很慢

我在Python 3灵活的应用引擎环境中通过Python库使用Google Cloud Datastore.我的烧瓶应用程序创建一个对象,然后将其添加到数据存储区:

ds = datastore.Client()
ds.put(entity)
Run Code Online (Sandbox Code Playgroud)

在我的测试中,每次调用put需要0.5-1.5秒才能完成.如果我像这里一个接一个地立即拨打两个电话,这不会改变.

我想知道我的对象的复杂性是否是问题.它是多层次的,例如:

object = {
    a: 1,
    ...,
    b: [
        {
            d: 2,
            ...,
            e: {
                h: 3
            }
        }
    ],
    c: [
        {
            f: 4,
            ...,
            g: {
                i: 5
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我通过嵌套创建datastore.Entity的,每个都初始化为:

entity = datastore.Entity(key=ds.key(KIND))
entity.update(object_dictionary)
Run Code Online (Sandbox Code Playgroud)

两个列表都是3-4个项目.对象的JSON等价物是~2-3kb.

这不是推荐的做法吗?我应该做什么呢?

更多信息:

我目前没有把这个包putEntity事务中.put只是一个薄薄的包装put_multi.put_multi似乎创建一个batch,发送Entity,然后提交batch.

我没有指定对象的"名称/ ID"(来自数据存储在线控制台的标题).我允许图书馆为我决定:

datastore.key(KIND)
Run Code Online (Sandbox Code Playgroud)

where KIND只是一个指定我的集合名称的字符串.替代方案是: …

python google-app-engine python-3.x google-cloud-datastore google-cloud-platform

5
推荐指数
1
解决办法
453
查看次数

Google+登录 - 服务器端流程 - 存储凭据 - Python示例

我正在使用Flask在Google App Engine上构建应用.我正在通过Python示例中描述的服务器端流程实施Google+登录:https://developers.google.com/+/web/signin/server-side-flowhttps://github.com/googleplus/gplus -quickstart-python/blob/master/signin.py.

这两个例子都有:

credentials = oauth_flow.step2_exchange(code)
Run Code Online (Sandbox Code Playgroud)

session['credentials'] = credentials
Run Code Online (Sandbox Code Playgroud)

将凭证对象存储到Flask会话.当我在我的Google App Engine项目上运行此代码时,出现错误:

TypeError: <oauth2client.client.OAuth2Credentials object at 0x7f6c3c953610> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

正如本期(标记为WontFix)中所讨论的,OAuth2Credentials不是由JSON可序列化设计的.它有方法to_jsonfrom_json,这可以用来存储,例如:

session['credentials'] = credentials.to_json()
Run Code Online (Sandbox Code Playgroud)

但是,在同一个问题中:

永远不要在Cookie中存储Credentials对象,它包含应用程序
客户端ID和客户端密钥.

也许我误解了Flask会话对象的工作原理,但是从doc:

...会话基本上可以记住从一个请求到另一个请求的信息.Flask的做法是使用签名cookie.因此,用户可以查看会话内容,但不能修改它,除非他们知道密钥...

因此,我们不应该在会话中存储凭证对象,即使它是签名cookie.

在我的情况下,我目前只需要重新使用访问令牌进行断开连接,所以我可以存储它.

处理这种情况的正确方法是什么?凭证是否应该存储在会话中?在这个例子中,是否应该发表评论"在这里安全地保存凭证"?

python session google-app-engine flask google-plus

3
推荐指数
1
解决办法
1761
查看次数

FFmpeg - 请求的输出格式“mpeg”不是合适的输出格式

我正在尝试使用 FFmpeg 将视频从 mp4 格式转换为 mpeg,以便我可以合并多个视频。我有一个 FFmpeg 的自定义构建,我可以在其中控制配置选项:

ffmpeg -y -i VID_20150514_171122_12085.mp4 -an -f mpeg VID_20150514_184208.mp4.0.mpg
ffmpeg version git-2015-02-25-b0d3322 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8 (GCC)
  configuration: --arch=arm --cpu=cortex-a8 --target-os=linux --enable-runtime-cpudetect --enable-pic --disable-shared --enable-static --cross-prefix=/home/jon/Development/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi- --enable-cross-compile --sysroot=/home/jon/Development/android-ndk-r10d/platforms/android-9/arch-arm/ --extra-cflags='-I../x264 -mfloat-abi=softfp -mfpu=neon -fPIE -pie' --extra-ldflags='-L../x264 -fPIE -pie' --enable-version3 --enable-gpl --disable-doc --enable-yasm --disable-everything --enable-decoder=mpeg --enable-decoder=mpeg4 --enable-decoder=aac --enable-decoder=h264 --enable-decoder=libx264 --enable-encoder=libx264 --enable-decoder=mpegvideo --enable-decoder=mpeg1video --enable-decoder=mpeg2video --enable-encoder=mpeg --enable-encoder=mpeg4 --enable-encoder=aac --enable-encoder=h264 --enable-encoder=mpeg1video --enable-encoder=mpeg2video --enable-parser=aac --enable-parser=mpeg4video --enable-parser=ac3 --enable-parser=h261 --enable-parser=h264 --enable-parser=vc1 --enable-demuxer=mpegvideo --enable-demuxer=aac --enable-demuxer=m4v --enable-demuxer=mov --enable-demuxer=h264 …
Run Code Online (Sandbox Code Playgroud)

video mpeg ffmpeg file-conversion codec

3
推荐指数
1
解决办法
2万
查看次数

FFmpeg - 无法识别的选项'map [outv]'

我正在使用FFmpeg合并一些视频文件,并且我的自定义构建存在问题.我正在使用以下Java代码来包装ffmpeg命令:

List<String> cmds = new ArrayList<>();
cmds.add("ffmpeg");
cmds.add("-i");
cmds.add("input1.mp4");
...
cmds.add("-map [outv]");
cmds.add("-map [a]");
...
cmds.add("output.mp4");

ProcessBuilder pb = new ProcessBuilder(cmds);
pb.directory(fileExec);
Process process = pb.start();
int exitVal = process.waitFor();
Run Code Online (Sandbox Code Playgroud)

我使用的命令是(缩写filter_complex):

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex “... [bla1][bla2]overlay=main_w-overlay_w:main_h-overlay_h:format=yuv420[outv]” -c:v libx264 -preset ultrafast -b:v 45000k -aspect 1.7777778 -map [outv] -map [a] -c:a libfdk_aac -ac 2 -b:a 128k -t 24 output.mp4
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Unrecognized option 'map [outv]'.
Run Code Online (Sandbox Code Playgroud)

我错过了包含地图的配置选项吗?我在哪里可以找到map命令需要哪些选项的信息?或者我的ffmpeg是否像许多其他类似的问题一样过时了?2015-02-25是最近的!

完整命令:

ffmpeg -y -i VID_20150609_154943_5583.mp4 -i VID_20150609_154943_24253.mp4 -i VID_20150609_154943_16083.mp4 -i stamp.png -f …
Run Code Online (Sandbox Code Playgroud)

java ffmpeg

0
推荐指数
1
解决办法
818
查看次数