L’audio est l’âme des médias, et pour les applications mobiles en particulier, il interagit davantage avec les utilisateurs, ajoute un autre niveau d’immersion et enrichit le contenu.
C’est un moteur majeur de mon obsession pour le développement de fonctions liées à l’audio. Dans mon récent article qui raconte comment j’ai développé une fonction de retouche de portrait pour une application de diffusion en direct, j’ai mentionné que je voulais créer une solution capable de retoucher de la musique. Je sais qu’une technologie appelée audio spatial peut aider à cela, et – devinez quoi – j’ai également trouvé une capacité dans HMS Core Audio Editor Kit, qui peut être intégrée indépendamment, ou utilisée avec d’autres capacités dans le SDK UI de ce kit.
J’ai choisi d’intégrer d’abord le SDK d’interface utilisateur dans ma démo, qui contient non seulement les fonctionnalités du kit, mais également une interface utilisateur prête à l’emploi. Cela me permet d’essayer la capacité audio spatiale et me libère de la conception de l’interface utilisateur. Plongeons maintenant dans la procédure de développement de la démo.
Procédure de développement
Les préparatifs
1. Préparez l’environnement de développement, qui a des exigences à la fois logicielles et matérielles. Ceux-ci sont:
Logiciels requis:
- Version JDK : 1.8 ou ultérieure
- Version Android Studio : 3.X ou plus tard
- minSdkVersion : 24 ou version ultérieure
- targetSdkVersion : 33 (recommandé)
- compileSdkVersion : 30 (recommandé)
- Version Gradle : 4.6 ou ultérieure (recommandé)
Exigences matérielles:
- Un téléphone exécutant EMUI 5.0 ou une version ultérieure, ou un téléphone exécutant Android dont la version va d’Android 7.0 à Android 13
2. Configurez les informations de l’application dans une plate-forme appelée AppGallery Connect et suivez le processus d’enregistrement en tant que développeur, de création d’une application, de génération d’une empreinte digitale de certificat de signature, de configuration de l’empreinte digitale du certificat de signature, d’activation du kit et de gestion de l’emplacement de traitement des données par défaut. .
3. Intégrez le SDK HMS Core.
4. Ajoutez les autorisations nécessaires dans le AndroidManifest.xml fichier, y compris l’autorisation de vibration, l’autorisation de microphone, l’autorisation d’écriture de stockage, l’autorisation de lecture de stockage, l’autorisation Internet, l’autorisation d’accès à l’état du réseau et l’autorisation d’obtenir l’état de connectivité réseau modifié.
Lorsque la version du SDK Android de l’application est 29 ou ultérieure, ajoutez l’attribut suivant au application élément, qui est utilisé pour obtenir l’autorisation de stockage externe.
<application
android:requestLegacyExternalStorage="true"
…… >
Intégration SDK
1. Initialisez le SDK de l’interface utilisateur et définissez les informations d’authentification de l’application. Si les informations ne sont pas définies, cela peut affecter certaines fonctions du SDK.
// Obtain the API key from the agconnect-services.json file.
// It is recommended that the key be stored on cloud, which can be obtained when the app is running.
String api_key = AGConnectInstance.getInstance().getOptions().getString("client/api_key");
// Set the API key.
HAEApplication.getInstance().setApiKey(api_key);
2. Créer AudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityqui est une activité personnalisée utilisée pour la sélection de fichiers audio.
/**
* Customized activity, used for audio file selection.
*/
public class AudioFilePickerActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
performFileSearch();
}
private void performFileSearch() {
// Select multiple audio files.
registerForActivityResult(new ActivityResultContracts.GetMultipleContents(), new ActivityResultCallback<List<Uri>>() {
@Override
public void onActivityResult(List<Uri> result) {
handleSelectedAudios(result);
finish();
}
}).launch("audio/*");
}
/**
* Process the selected audio files, turning the URIs into paths as needed.
*
* @param uriList indicates the selected audio files.
*/
private void handleSelectedAudios(List<Uri> uriList) {
// Check whether the audio files exist.
if (uriList == null || uriList.size() == 0) {
return;
}
ArrayList<String> audioList = new ArrayList<>();
for (Uri uri : uriList) {
// Obtain the real path.
String filePath = FileUtils.getRealPath(this, uri);
audioList.add(filePath);
}
// Return the audio file path to the audio editing UI.
Intent intent = new Intent();
// Use HAEConstant.AUDIO_PATH_LIST that is provided by the SDK.
intent.putExtra(HAEConstant.AUDIO_PATH_LIST, audioList);
// Use HAEConstant.RESULT_CODE as the result code.
this.setResult(HAEConstant.RESULT_CODE, intent);
finish();
}
}
Les FileUtils La classe utilitaire est utilisée pour obtenir le chemin réel, qui est détaillé ici. Vous trouverez ci-dessous le chemin d’accès à cette classe.
app/src/main/java/com/huawei/hms/audioeditor/demo/util/FileUtils.java
3. Ajoutez le action valeur à AudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivityAudioFilePickerActivity dans AndroidManifest.xml. Le SDK dirigerait vers un écran selon ceci action.
<activity
android:name=".AudioFilePickerActivity"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.hms.audioeditor.chooseaudio" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
4. Lancez l’écran d’édition audio via :
- Mode 1 : Lancer l’écran sans paramètres d’entrée. Dans ce mode, les configurations par défaut du SDK sont utilisées.
HAEUIManager.getInstance().launchEditorActivity(this);
- Mode 2 : lance l’écran d’édition audio avec les paramètres d’entrée. Ce mode vous permet de définir la liste des menus et de personnaliser le chemin d’un fichier de sortie. En plus de cela, le mode permet également de spécifier les chemins d’accès aux fichiers audio d’entrée, de définir le mode brouillon, etc.
Lancez l’écran avec la liste des menus et le chemin du fichier de sortie personnalisé :
// List of level-1 menus. Below are just some examples:
ArrayList<Integer> menuList = new ArrayList<>();
// Add audio.
menuList.add(MenuCommon.MAIN_MENU_ADD_AUDIO_CODE);
// Record audio.
menuList.add(MenuCommon.MAIN_MENU_AUDIO_RECORDER_CODE);
// List of level-2 menus, which are displayed after audio files are input and selected.
ArrayList<Integer> secondMenuList = new ArrayList<>();
// Split audio.
secondMenuList.add(MenuCommon.EDIT_MENU_SPLIT_CODE);
// Delete audio.
secondMenuList.add(MenuCommon.EDIT_MENU_DEL_CODE);
// Adjust the volume.
secondMenuList.add(MenuCommon.EDIT_MENU_VOLUME2_CODE);
// Customize the output file path.
String exportPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath() + "https://dzone.com/";
AudioEditorLaunchOption.Builder audioEditorLaunch = new AudioEditorLaunchOption.Builder()
// Set the level-1 menus.
.setCustomMenuList(menuList)
// Set the level-2 menus.
.setSecondMenuList(secondMenuList)
// Set the output file path.
.setExportPath(exportPath);
// Launch the audio editing screen with the menu list and customized output file path.
try {
HAEUIManager.getInstance().launchEditorActivity(this, audioEditorLaunch.build(), new LaunchCallback() {
@Override
public void onFailed(int errCode, String errMsg) {
Toast.makeText(mContext, errMsg, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
Lancez l’écran avec les chemins de fichiers audio d’entrée spécifiés :
// Set the input audio file paths.
ArrayList<AudioInfo> audioInfoList = new ArrayList<>();
// Example of an audio file path:
String audioPath = "/storage/emulated/0/Music/Dream_It_Possible.flac";
// Create an instance of AudioInfo and pass the audio file path.
AudioInfo audioInfo = new AudioInfo(audioPath);
// Set the audio name.
audioInfo.setAudioName("Dream_It_Possible");
audioInfoList.add(audioInfo);
AudioEditorLaunchOption.Builder audioEditorLaunch = new AudioEditorLaunchOption.Builder()
// Set the input audio file paths.
.setFilePaths(audioInfoList);
// Launch the audio editing screen with the specified input audio file paths.
try {
HAEUIManager.getInstance().launchEditorActivity(this, audioEditorLaunch.build(), new LaunchCallback() {
@Override
public void onFailed(int errCode, String errMsg) {
Toast.makeText(mContext, errMsg, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
Dans ce mode, l’écran d’édition audio affiche directement les menus de niveau 2 après le lancement de l’écran.
Lancez l’écran avec les brouillons :
// Obtain the draft list. For example:
List<DraftInfo> draftList = HAEUIManager.getInstance().getDraftList();
// Specify the first draft in the draft list.
String draftId = null;
if (!draftList.isEmpty()) {
draftId = draftList.get(0).getDraftId();
}
AudioEditorLaunchOption.Builder audioEditorLaunch = new AudioEditorLaunchOption.Builder()
// Set the draft ID, which can be null.
.setDraftId(draftId)
// Set the draft mode. NOT_SAVE is the default value, which indicates not to save a project as a draft.
.setDraftMode(AudioEditorLaunchOption.DraftMode.SAVE_DRAFT);
// Launch the audio editing screen with drafts.
try {
HAEUIManager.getInstance().launchEditorActivity(this, audioEditorLaunch.build(), new LaunchCallback() {
@Override
public void onFailed(int errCode, String errMsg) {
Toast.makeText(mContext, errMsg, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
Et juste comme ça, l’intégration du SDK est terminée et le prototype de l’application d’édition audio que je veux est prêt à être utilisé.
Pas mal. Il a toutes les fonctions nécessaires d’une application d’édition audio, et le meilleur de tous, c’est assez facile à développer,…