【问题标题】:How use RingtoneManager.setType() in Delphi如何在 Delphi 中使用 RingtoneManager.setType()
【发布时间】:2018-07-04 17:23:39
【问题描述】:

在 Delphi 10.2 Tokyo 中使用 Androidapi.JNI.Media

我正在尝试列出可用的铃声并播放与当前默认设置不同的铃声。

JAudioManagerJRingtoneManager的初始化好像没问题,因为我可以播放默认铃声。

但是当我尝试使用RingtoneManager 设置Type 或获取Cursor 时,程序终止并弹出系统提示“应用程序(名称)被中断 - 重新启动应用程序”。

procedure TAudioPlayBackForm.Button2Click(Sender: TObject);
var
  AudioObj: JObject;
  AudioMgr: JAudioManager;
  RingtoneMgr: JRingtoneManager; 
  aUri: Jnet_Uri;
  cur: JCursor;
  ringt: JRingtone;
begin
  AudioObj := TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE );
  RingtoneMgr := TJRingtoneManager.Wrap((AudioObj as ILocalObject).GetObjectID);
  Log.d('TJRingtoneManager wrap ok');

  aUri := TJRingtoneManager.JavaClass.getActualDefaultRingtoneUri(SharedActivityContext, TJRingtoneManager.JavaClass.TYPE_NOTIFICATION);
  Log.d('getActualDefaultRingtoneUri = '+ JStringToString(aUri.toString) );                                                        

  ringt := TJRingtoneManager.JavaClass.getRingtone(SharedActivityContext, aUri);
  Log.d('getRingtone uri ok = '+ JStringToString( ringt.getTitle(SharedActivityContext) ));

  ringt.play;  // OK !

  RingtoneMgr.setType( 4 );   // <-- CRASH !
  Log.d('RingtoneMgr setType ok');

  cur := RingtoneMgr.getCursor;   // <-- CRASH !
  Log.d('RingtoneMgr getCursor ok = '+ intToStr(cur.getColumnCount));
end;

有什么想法吗?我忘了初始化什么吗?

我使用this documentation 作为参考。

【问题讨论】:

    标签: android delphi delphi-10.2-tokyo ringtonemanager


    【解决方案1】:

    您创建的 RingtoneManager 实例不正确。应该是:

    // Forget about obtaining AudioObj - it's not relevant
    RingtoneMgr := TJRingtoneManager.JavaClass.init(TAndroidHelper.Activity);
    

    这需要 Androidapi.Helpers 单元

    【讨论】:

    • 顺便说一句,说程序“崩溃”并不是很有用。更具体地说明会发生什么,即确切错误消息(如果有),最好提供调用堆栈
    • 非常感谢戴夫。是否有必要以某种方式释放这样初始化的 RingtoneMgr ?我问是因为在单击一些按钮 (14) 后不再发出声音,但应用程序仍在运行并产生 logcat 消息...
    • 这些 logcat 消息是否表明有任何问题?由于 RingtoneMgr 是一个本地引用和一个接口,一旦方法退出,该引用将自动销毁。其他人也一样
    • @DaveNottage 因为 Activity 被传递给“构造函数”(init()),它可能持有对该对象的引用。因此,您可能需要在使用完毕后明确地DisposeOf()
    • @RemyLebeau 我认为您的意思是将引用设置为 nil。
    猜你喜欢
    • 2021-10-25
    • 2014-08-24
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多